我有一个问题。我使用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才能正确完成?
答案 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);
希望这个帮助