【问题标题】:remove related @OneToOne automatically in JPA在 JPA 中自动删除相关的 @OneToOne
【发布时间】:2011-02-10 14:39:22
【问题描述】:

我在 JPA 中使用以下内容:

@Entity
class ParentClass {
  @Id
  @GeneratedValue
  private long id;
  ...
  @OneToOne(cascade = { cascade = { CascadeType.ALL }, 
                        mappedBy = "parentClass")
  ChildClass child;
  ..
}

@Entity
class ChildClass {

  @OneToOne
  ParentClass parentClass;

}

如果我执行 createQuery("DELETE FROM ParentClass pc") 之类的查询,我的子类不会自动删除。

这可以用 JPA-2.0 完成吗? (我确实使用 @OneToMany 关系)。

【问题讨论】:

    标签: java hibernate jpa jpa-2.0


    【解决方案1】:

    DELETE FROM ParentClass pc 等批量 DML 查询忽略级联选项和 orphanRemoval,因此如果您确实需要在批量查询中执行此操作,则无法将 JPA 配置为自动删除 ChildClasses。

    但是,您可以通过将REFERENCES ... ON DELETE CASCADE 约束添加到数据库架构中ChildClass 的外键来配置数据库。

    【讨论】:

    • +1 我相信这是正确的答案。我认为,ON DELETE CASCADE 可能会导致一些小问题,因为 JPA 提供者不会接受它。因此,如果您稍后决定再次调用 em.persist(child) 之类的东西,JPA 会认为它已经持久化等。此外,不会从缓存等中清除子级。
    • 谢谢,我真的不需要做一个“批量”查询,所以我用一个简单的 remove() 替换它。我没有尝试执行 REFERENCES...CASCADE,因为我期望它依赖于 DBMS,而不是标准 SQL 的一部分?
    【解决方案2】:

    在 JPA2 中,您可以在 @OneToOne 注释上设置 orphanRemoval = true。但是我会说 CascadeType.ALL 应该处理这个问题。如果您调用 em.remove(parentClass) 而不是调用查询会怎样。

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2016-12-13
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多