无法级联删除@OneToOne成员

时间:2010-11-11 04:15:30

标签: sql mysql hibernate jpa h2

@Entity public class Organization {

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

}

我有以下实体定义,当父对象被删除时,它生成一个SQL以对@OneToOne条目进行级联删除。但是在删除组织时并没有删除“天”条目。

这发生在h2,mysql数据库中,这可能是什么问题。

2 个答案:

答案 0 :(得分:6)

好吧,我想你应该加一个

@Cascade(value = {DELETE, DELETE_ORPHAN})

请注意,在JPA 2.0中,您不必使用hibernate-sepcific @Cascade注释 - @*ToMany可以选择删除孤儿。

使用查询级联

更新 处理。你必须手动处理它们。这是预期和记录的行为。

答案 1 :(得分:5)

  

我的查询看起来像是“从组织中删除some_key_id =?” (我没有基于主键ID删除它)

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

  

4.10批量更新和删除操作

     

...

     

删除操作仅适用于   指定类的实体和   它的子类。 它没有级联到   相关实体

这是一个非常恼人的限制,有许多RFE可以改善事物(HHH-695HHH-1917HHH-3337HHH-5529等。

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

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

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