【问题标题】:Hibernate orphanRemoval on shared entities共享实体上的休眠 orphanRemoval
【发布时间】:2020-08-12 19:26:19
【问题描述】:

给定一个实体 B,它有一个字符串和一个日期值。

每个工作负载创建一次 B 的实例,并由每个工作负载中创建的所有其他实体共享。

 B bee = new B();

我们有另一个实体类 A,每个工作负载只创建一次,并且:

  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
  List<B> bees = new B(); 

然后,我们为实体 a 添加一次a.bees.add(bee);,为其他实体类型 c - z 添加一次。

现在,由于这只蜜蜂是共享的,当我删除具有此 b 的 A 类型实体时会发生什么?

尽管 B 可能被 A 以外的其他实体引用,hibernate 会尝试删除它吗?

只有当 b 不再被 ANYWHERE 引用时,有没有办法 ORPHANDELETE / CASCADE DELETE?

【问题讨论】:

  • This 问题类似,但它并没有真正说明子实体是否仅在被所有父母或任何父母孤立后才被删除。我猜你可以创建一个简单的单元测试并自己尝试一下。
  • 是的,我遇到过类似但不完全是这种情况。

标签: java sql hibernate


【解决方案1】:
  • orphanRemovalCascadeType.REMOVE 用于在父实体不再引用子实体或删除父实体时删除子实体。在这两种情况下,您都在对检索到的父实体进行操作,因此 hibernate 将对子实体执行操作,因为它已经知道了。

  • 为了实现您的目标,hibernate 需要知道还有谁引用了该子实体。 hibernate 无法自动完成。

  • 但是如果您的子实体引用了所有其他实体,您可以使其不再引用那些其他实体,因此只有父实体将保留为与其关联的实体。所以现在当你从这个父级中删除它时,可以通过orphanRemovalCascadeType.REMOVE 删除它

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2015-04-22
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多