簡體   English   中英

為什么 hibernate 為 OneToMany 映射生成插入和更新

[英]Why hibernate generates insert and update for OneToMany mapping

我試圖通過一個小例子來理解 Hibernate 中的一對多映射。 我有一個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 操作 - insertupdate 如果單個insert命令足以在表中添加記錄,那么為什么在這種情況下休眠同時使用插入和更新? 請解釋。

我知道這太老了,但我遇到了同樣的問題,谷歌把我帶到了這里,所以在修復它之后我想我應該發布一個答案。

如果您使連接列不可為空且不可更新,則 Hibernate 會將插入/更新方法切換為直接插入,我認為在您的情況下無論如何都不是:

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

如果 Part 作為復合元素列表,那么只會出現兩個查詢。 請檢查並恢復。

如果它不是復合元素,hibernate 會嘗試將個體作為單獨的查詢插入,並嘗試在它們之間創建關系。

在較早的情況下,休眠將插入關系鍵。

**休眠:插入產品 (serialNumber) 值 (?)

Hibernate:插入 Part (partName, id) 值 (?, ?)**

在這兩個查詢中,hibernate 只是將一條記錄插入到數據庫中。 在那個階段,hibernate 不會在兩個實體之間創建任何關系。

休眠:更新部件集 PRODUCT_ID=? 哪里 id=?

現在在制作實體表后,hibernate 將使用上面的第三個查詢在兩者之間建立關系......

關聯是單向的,因此Product是擁有方(因為它是唯一的一方)。

使關聯雙向並使Part成為關聯所有者。 這樣您將避免冗余更新,因為外鍵值將被指定為 Part 的插入語句的Part

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM