JPA:删除孤立孙子元素时的问题

时间:2014-12-16 15:53:02

标签: java spring jpa

我有三个课程,每个课程都有一个表格:

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:不能   执行声明

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

当拥有如此深层次的层次结构时,你必须追逐指针"。当您将Ab设置为null时,JPA正确地尝试删除表中的B实体,但是您得到约束违规,因为它仍然具有C的引用。您还必须首先设置为空Bc并根据您的设置C将是从表中删除,以及Bc参考(FK)

JPA在冲洗期间隐含地应用了B的删除;你没有自己调用删除,所以B中的cascade.ALL没有生效。如果你在数据库级别有一个带级联删除的FK,那么从理论上讲它可能会有效,但应用孤立删除的顺序依赖于实现,而JPA不建议依赖它。