[英]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 操作 - insert
和update
。 如果單個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.