【问题标题】:Will Hibernate saveOrUpdate method delete children?Hibernate saveOrUpdate 方法会删除孩子吗?
【发布时间】:2012-05-08 20:33:21
【问题描述】:

我有一个应用程序通过休眠加载对象,然后将这些对象作为分离对象传递到另一层。对这些对象的任何更改都会发送回休眠层,我在这些对象上调用saveOrUpdate()

如果我只是在调用saveOrUpdate() 之前从集合中删除子对象,休眠将删除传递给saveOrUpdate() 的对象中的集合中包含的一对多关系子对象吗?

如果不是,那么这通常如何在使用分离对象的休眠应用程序中完成?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果我在调用saveOrUpdate()之前简单地从集合中删除子对象,休眠将删除传递给saveOrUpdate()的对象中包含在集合中的一对多关系子对象吗?

    不,默认情况下不是。在这种情况下,此类子对象被称为“孤儿”,假设某些其他实体也没有对它们的引用。

    这在文档中进行了讨论,11.11. Transitive persistence:

    一种特殊的级联样式delete-orphan 仅适用于一对多关联,并指示应将delete() 操作应用于从关联中删除的任何子对象。使用注释没有 CascadeType.DELETE-ORPHAN 等价物。相反,您可以使用如示例 11.4 中所示的属性 orphanRemoval,“@OneToManyorphanRemoval”。 如果从@OneToMany 集合中删除一个实体,或者从@OneToOne 关联中取消引用一个关联实体,如果orphanRemoval 设置为true,则可以将此关联实体标记为删除。。 p>

    【讨论】:

    • 这是有道理的。但是,当我在集合上设置 CascadeType.ALL, orphanRemoval=true 时,子对象仍然没有被删除。这可能是因为我将 JoinColumn 注释与 OneToMany 注释结合使用吗?
    • @Tom:可能不是,不,@JoinColumn 只是用来覆盖默认的连接列名。看来Hibernate并不认为自己是孤儿。您确定其他实体没有引用该孩子吗?
    • 绝对不是从其他实体引用的。然而,底层的数据库关系实际上是一个多对多,我将 OneToMany 与 JoinColumn 一起使用以使模型更简单。也许那是扔它?否则我也只是注意到子实体的某些子实体包含不能设置 orphanRemoval 属性的 ManyToOne 关系。也许这会以某种方式阻止删除父级。
    【解决方案2】:

    默认情况下不会。您可以使用@Cascade(CascadeType.DELETE_ORPHANS) 来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多