5
@Entity public class Organization {

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

}

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

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

4

2 回答 2

6

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

@Cascade(value = {DELETE, DELETE_ORPHAN})

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

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

于 2010-11-11T06:18:24.103 回答
5

我的查询看起来像这样“从组织中删除 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吗?如果没有,请添加它。

于 2010-11-11T07:42:08.870 回答