Hibernate が OneToMany マッピングの挿入と更新を生成する理由 質問する

Hibernate が OneToMany マッピングの挿入と更新を生成する理由 質問する

小さな例を使って、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。テーブルにレコードを追加するにはupdate1 つのinsertコマンドで十分なのに、この場合、Hibernate はなぜ挿入と更新の両方を使用するのでしょうか。説明してください。

ベストアンサー1

これはかなり古いことだとはわかっていますが、私も同じ問題を抱えていて、Google でここにたどり着いたので、問題を解決した後、回答を投稿すべきだと思いました。

結合列を NULL 不可かつ更新不可にすると、Hibernate は挿入/更新アプローチをストレート挿入に切り替えます。この場合、どちらでもないと想定します。

@JoinColumn(name = "PRODUCT_ID", nullable = false, updatable = false)

おすすめ記事