小さな例を使って、Hibernate の 1 対多のマッピングを理解しようとしています。Product
のセットを持つ がありますPart's
。私のエンティティ クラスは次のとおりです。
Part.java
@Entity
public class Part {
@Id
@GeneratedValue
int id;
String partName;
//Setters & Getters
}
Product.java
@Entity
public class Product {
private String serialNumber;
private Set<Part> parts = new HashSet<Part>();
@Id
public String getSerialNumber() {
return serialNumber;
}
@OneToMany
@JoinColumn(name = "PRODUCT_ID")
public Set<Part> getParts() {
return parts;
}
// Setter methods
}
次に、いくつかの部品と製品をデータベースに保存しようとしたところ、Hibernate によって生成された以下のクエリが観察されました。
Hibernate: insert into Product (serialNumber) values (?)
Hibernate: insert into Part (partName, id) values (?, ?)
Hibernate: update Part set PRODUCT_ID=? where id=?
ここで、テーブルにレコードを追加するためにPart
、Hibernate は と の 2 つの DML 操作を生成しますinsert
。テーブルにレコードを追加するにはupdate
1 つのinsert
コマンドで十分なのに、この場合、Hibernate はなぜ挿入と更新の両方を使用するのでしょうか。説明してください。
ベストアンサー1
これはかなり古いことだとはわかっていますが、私も同じ問題を抱えていて、Google でここにたどり着いたので、問題を解決した後、回答を投稿すべきだと思いました。
結合列を NULL 不可かつ更新不可にすると、Hibernate は挿入/更新アプローチをストレート挿入に切り替えます。この場合、どちらでもないと想定します。
@JoinColumn(name = "PRODUCT_ID", nullable = false, updatable = false)