我有一個帶有一些子物體的父物體。保存新的父物體及其子物體時,Spring 能夠呼叫persist,我可以看到只生成了一些 INSERT 陳述句。
問題是當我將一些新的子物體添加到現有的父物體并保存它時,Spring 呼叫merge而不是我發現在它們的 INSERT 陳述句之前為這些新的子物體生成了一些 SELECT 陳述句。
如何避免這些額外的 SELECT 陳述句?
例如
@Entity
public class MyParent {
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "myParent", cascade = CascadeType.ALL)
private Set<MyChild> children;
}
@Entity
public class MyChild {
...
}
和
MyParent myParent = buildNewParentAndChildren();
myParentRepository.save(myParent); // deep down calls persist(), generates INSERT only
但
MyParent myParent = myParentRepository.findById(1);
MyChild myChild = buildNewChild();
myParent.getMyChildren().add(myChild);
myParentRepository.save(myParent); // deep down calls merge(), generates SELECT and INSERT
uj5u.com熱心網友回復:
您正在向集合中添加一個元素。這必須初始化惰性集合 - 因此你得到你的SELECT.
請注意,您根本不需要使用集合來添加元素。您通過宣告mappedBy = "myParent". 這意味著孩子負責保持與父母的關聯。
所以你需要的是:
MyParent myParent = myParentRepository.findById(1);
MyChild myChild = buildNewChild();
myChild.setParent(myParent);
someRepository.persist(myChild)
下次您從不同的 Hibernate Session 中選擇 MyParent 時,您將在集合中獲得新元素。
僅當您打算在同一請求中使用該串列時,才有意義添加到集合中。但這意味著您確實需要SELECT.
PS:如果您擺脫 Spring Data 以支持 Hibernate Session 或 JPA EntityManager,您也可以通過使用or來消除SELECTMyParent 。session.load(1)entityManager.getRerence(1)
uj5u.com熱心網友回復:
你正在使用Set兒童。這很好,但根據它的定義,它應該檢查新添加的孩子之前是否不存在于集合中。考慮List改用。
另外,我建議檢查如何正確為物體實作 equals() 和 hashCode()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/521698.html
標籤:爪哇弹簧靴休眠jpa
