无法级联删除@OneToOne成员

Sam*_*Sam 5 mysql sql hibernate jpa h2

@Entity public class Organization {

    @OneToOne(fetch = FetchType.EAGER)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @Cascade(value = DELETE_ORPHAN)
    private Days days;

}
Run Code Online (Sandbox Code Playgroud)

我有以下实体定义,它生成一个SQL,在父对象被删除时对@OneToOne条目进行级联删除.但是删除组织时不会删除"days"条目.

这种情况发生在h2,mysql数据库中,这可能是什么问题.

Boz*_*zho 6

好吧,我想你应该添加一个

@Cascade(value = {DELETE, DELETE_ORPHAN})
Run Code Online (Sandbox Code Playgroud)

请注意,在JPA 2.0中,您不必使用hibernate-sepcific @Cascade注释 - @*ToMany有一个删除孤儿的选项.

更新:使用查询时,不会处理级联.你必须手动处理它们.这是预期和记录的行为.


Pas*_*ent 5

我的查询看起来像这样"从组织中删除some_key_id =?" (我不是根据主键ID删除它)

批量删除(你应该在你的问题中提到)不会级联到任何东西.引用JPA 1.0规范:

4.10批量更新和删除操作

...

删除操作仅适用于指定类及其子类的实体.它不会级联到相关实体.

这是一个非常烦人的限制,有很多RFE可以改善(HHH-695,HHH-1917,HHH-3337,HHH-5529等).

目前,可能的解决方案包括:

  1. 自己清理孩子桌子
  2. 在架构中使用级联外键.

现在奇怪的部分......我的理解@OnDelete(action = OnDeleteAction.CASCADE)是这个注释应该用于确保使用适当的ON DELETE CASCADE子句创建外键(解决方案#2).换句话说,我希望事情能发挥作用.

Hibernate生成了Organization表吗?你能看看DDL吗?你看到了预期的ON DELETE CASCADE吗?如果没有,请添加它.