JPA Cascade删除了孤儿

时间:2013-06-10 06:51:41

标签: jpa many-to-many

我有一个问题。我使用JPA和eclipselink我有关系:

Table A ---< Table AB >---- Table B

class A {    
@OneToMany(mappedBy = "a")
private List<AB> abList    
}

class AB {    
@ManyToOne(fetch = FetchType.LAZY)
private A a;    
@ManyToOne(fetch = FetchType.LAZY)
private B b;    
}

class B {    
@OneToMany(mappedBy = "b")
private List<AB> abList;
}

A和B之间是连接表AB的ManyToMany关系。 现在我想从表A中删除一条记录,并从表AB(连接表)和B表中级联删除记录。

但是从B只有那些与表A中的任何其他记录没有关联的那些(A和B之间的many-to-many关系)。

我应该如何设置CascadeType或orphanremoval才能正确完成?

2 个答案:

答案 0 :(得分:2)

如果要在删除A时删除AB和B,则只需设置cascade remove,(如果要删除实例,则删除orphanRemoval = true)。

如果从A到B的关系是真正的ManyToMany,即B可以有多个引用,那么你不能将删除级联到B,(但仍然可以级联到AB,确保你在模型中保持双向关系)。

如果从任何地方都没有与之关系,就无法删除B.这就像垃圾收集一样,在关系数据库中不存在。您需要从您的应用程序处理此问题。如果B是你要用A删除的东西,那么考虑不要让它共享,但是每个A都有自己的私有B实例。

答案 1 :(得分:0)

我想你正在使用Hibernate 你应该制作一个orphanRoval = true,

之后尝试这个: 假设我们需要删除a(哪个类是A), 我们做:

 for (AB ab : a.getAbList()) {
    B b = ab.get();
    if (b.getAbList().size()==1) {
        em.remove(b);
   }
   em.remove(ab);
 }
 em.remove(a);

希望这个帮助