我有三个班级(A有很多B,有很多C):
class A {
@OneToMany (mappedBy="a", fetch = FetchType.LAZY, cascade=CascadeType.ALL)
public List<B> bs;
public List<B> getBs() {
return bs;
}
public void setBs(List<B> bs) {
this.bs = bs;
}
}
class B {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a")
private A a;
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
@OneToMany (mappedBy="b", fetch = FetchType.LAZY, cascade=CascadeType.ALL)
public List<C> cs;
public List<C> getCs() {
return cs;
}
public void setCs(List<C> cs) {
this.cs = cs;
}
}
class C {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "b")
private B b;
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
}
我使用Spring Data来处理删除。以下是我能够成功完成的事情:
如果删除单个记录B,则会删除此记录,并自动删除其关联的C记录。
如果删除单个记录A,则会删除此记录,并自动删除其关联的B / C记录。
但是,如果我想通过以下方式删除A的B记录(没有删除A记录):
public void deleteByA(A a) {
//em is EntityManager
Query q = em.createNamedQuery("delete from B where a = :a");
q.setParameter("a", a);
q.executeUpdate();
}
我总是收到以下错误:
DELETE语句与REFERENCE约束“FK_1pbkk0g3b9vnx7apvisddsh7e”冲突。冲突发生在数据库“mydb”,表“dbo.C”,列“b”。
上面有没有明显的地方我做错了?可能出现什么问题?
感谢任何输入!!!
答案 0 :(得分:2)
问题很简单,删除查询不会考虑级联注释。它们是低级查询,转换为SQL并执行,但绕过会话(即,如果删除会话中的实体,它不会在会话中被标记为已删除)和级联机制。
因此,要么通过调用em.remove()来获取Bs并删除它们,要么像对待SQL一样删除它们:首先明确删除Cs,然后使用删除查询删除Bs。但再一次,请阅读限制:删除查询无法使用连接(除非连接位于子选择中)。