簡體   English   中英

OneToMany ManyToOne使用Hibernate刪除子對象

[英]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);
}

我的理解(如果我錯了,請糾正我):

  1. 我們有orphanRemoval=true所以deleteB_Y(int)將起作用。
  2. 通過設置mappedBy參數,我們可以說類A是關系的“擁有站點”。
  3. 當我們持久/更新/合並/刪除類A時使用CascadeType(然后它在子屬性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 Aclass 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.

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