【问题标题】:Unable to cascade delete a @OneToOne member无法级联删除 @OneToOne 成员
【发布时间】:2011-05-08 06:28:39
【问题描述】:
@Entity public class Organization {

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

}

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

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

【问题讨论】:

    标签: sql mysql hibernate jpa h2


    【解决方案1】:

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

    @Cascade(value = {DELETE, DELETE_ORPHAN})
    

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

    更新:使用查询级联时处理。您必须手动处理它们。这是预期并记录在案的行为。

    【讨论】:

    • 添加 DELETE 对我没有帮助,我们还没有在 JPA2.0 中
    • 我的查询看起来像这样“从组织中删除 some_key_id = ?” (我不是根据主键 id 删除它)
    • @Samuel,那么您必须手动处理删除。查看我的更新。
    【解决方案2】:

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

    批量删除(您应该在问题中提及)不会级联到任何内容。引用 JPA 1.0 规范:

    4.10 批量更新和删除操作

    ...

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

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

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

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

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

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

    【讨论】:

    • 奇怪的部分是“on delete cascade”被自动添加为约束,但在某些情况下它没有得到尊重。
    • 经过更多调查,我发现“on delete cascade”在我只删除父级时有效(例如,如果它是单级),但如果父级本身包含为@OneToMany超级父母这似乎不起作用。
    • @Samuel 现在看起来像是一个纯粹的数据库/H2/MySQL 问题。这超出了我的专业知识。我的建议是问一个“面向数据库”的问题(用简化的表格说明你的上下文),从数据库专家那里得到答案,看看这是否符合预期。
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多