我有三个课程,每个课程都有一个表格:
Class A {
long id;
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
B b;
}
Class B {
long id;
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
C c;
}
Class C {
long id;
}
每个表格中都有一个条目。表B和C之间的链接基于外键。如果我将A.b
设置为null,然后更新类A的表,它首先删除类B的表条目,然后删除类C的表条目,这会导致违规异常:
delete from B_table where id=? [23503-176]];
嵌套异常是:
org.hibernate.exception.ConstraintViolationException:不能 执行声明
有什么想法吗?
答案 0 :(得分:1)
当拥有如此深层次的层次结构时,你必须追逐指针"。当您将Ab设置为null时,JPA正确地尝试删除表中的B实体,但是您得到约束违规,因为它仍然具有C的引用。您还必须首先设置为空Bc并根据您的设置C将是从表中删除,以及Bc参考(FK)
JPA在冲洗期间隐含地应用了B的删除;你没有自己调用删除,所以B中的cascade.ALL没有生效。如果你在数据库级别有一个带级联删除的FK,那么从理论上讲它可能会有效,但应用孤立删除的顺序依赖于实现,而JPA不建议依赖它。