[英]OneToMany ManyToOne removing child object with Hibernate
我正在使用Spring Boot和Hibernate。 假設我們有兩個實體:
@Entity
public class A{
@OneToMany(mappedBy = "objectA",fetch = FetchType.EAGER,cascade = CascadeType.ALL,orphanRemoval=true)
private Set<B> objectSet = new HashSet<>();
}
@Entity
public class B{
@ManyToOne
private A objectA;
}
我們有兩種跨界方法;
deleteB_X(int idB){
entityManager.remove(entityManager.find(idB,B.class));
}
deleteB_Y(int idB){
B obj=entityManager.find(idB,B.class);
obj.getObjectA().getObjectSet().remove(obj);
}
我的理解(如果我錯了,請糾正我):
orphanRemoval=true
所以deleteB_Y(int)
將起作用。 mappedBy
參數,我們可以說類A是關系的“擁有站點”。 objectSet
上調用持久/更新/合並/刪除)。 我想我們可以說這可以保護我免受最終以B對象而不是A類為對象的情況(除非我們手動添加一些B objs)。 據我了解,CascadeType不應與orphanRemoval相互干擾,因為CascadeType負責處理我們對A的對象進行“某些處理”的事情(然后遞歸地對B的對象進行處理)。 這是我一點都不了解的東西。 為什么deleteB_x(int)
不起作用,為什么如果我們刪除CascadeType,它就會開始起作用? 我覺得這樣的deleteB_X(int)
是非常清潔的解決方案,以從DB不是刪除對象B deleteB_Y(int)
但遺憾的是它不會工作,因為它用的CascadeType colides。
編輯1。 方法deleteB_X(int)
只是不會從數據庫中刪除對象,如果我們刪除cascade = CascadeType.ALL
一切都可以。 為什么?
問題是我的class A
在class B
實例中被獲取了EAGER
,因此(我假設)當我單獨刪除B
的實例而不照顧private Set<B> objectSet
中的相同B
實例時,存在沖突。 private Set<B> objectSet
。 將EAGER
更改為LAZY
或從@OneToMany(cascade=...)
排除CascadeType.PERSIST
解決了我的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.