【问题标题】:Hibernate cascading: should setting to null on a parent delete children?休眠级联:是否应该在父级上设置为空删除子级?
【发布时间】:2010-04-18 08:16:44
【问题描述】:

Collection.clear() 将在 Session 刷新时删除子项。

OneToOne 怎么样?设置为 null 不是正确的方法。不存在 OneToOne 的 clear() 方法。

Table_A 有一个列(不是它的 PK!),OneToOne 引用了 Table_B。

我想知道 Hib 在我的情况下是否按预期工作?

我的级联选项设置为“all,delete-orphan”。

表_A @OneToOne 表_B

表_B @OneToMany 表_C

现在它看起来像 Table_A 。获取表_B。 getTable_C_Collection()

假设 Table_C 集合中有元素。

我对 Hibernate 的期望:如果我将 Table_B 链接设置为 null,那么

必须删除所有 Table_C 集合元素。

它不会发生。他们成为孤儿!

【问题讨论】:

  • 您可以发布您的休眠配置(或者如果使用休眠注释,则发布注释)?听起来您可能有配置问题。
  • 删除Table_B是否会直接删除Table_C中的成员,还是只有在Table_A中将Table_B链接设置为null时才会出现这个问题?
  • @Jim Hurne 对于您的第二条评论:如果我理解您,那么我的回答是:我不想删除 B 的实例!我想处理A,它是主要对象,它引用了B,所以我只想删除他的B链接并期望Hibernate会做其他事情。

标签: java hibernate


【解决方案1】:

您是否尝试过“all-delete-orphan”而不是“all,delete-orphan”?两者应该工作相同,但过去曾出现过问题,即其中一个的行为与另一个不同。此类问题实际上是错误,因此如果使用其中一个而不是另一个的行为确实不同,请务必open a bug

您可能还想在 Hibernate 映射中设置 inverse='true'。从documentationthis Stack Overflow Question 看来,inverse=true 通常是使级联删除正常工作的关键。

【讨论】:

    【解决方案2】:

    Hibernate 对级联操作的支持有时可能有点古怪。如果您发现无法开箱即用地获得所需的行为,您可以实现Hibernate Interceptor or a Hibernate event listener。做以太实际上很容易,而且付出的努力是值得的(你的主要代码保持干净)。

    在这种情况下,您可能希望实现 PostUpdateEventListenerPreUpdateEventListener

    【讨论】:

      【解决方案3】:

      不,如果您打开了级联,删除父级将删除子级。

      您需要将 DELETE SQL 发送到数据库,仅设置对 null 的引用不会这样做。

      【讨论】:

      • @duffymo 但这很奇怪。你看:我们如何删除链接对象(子对象):Collection.clear()。以及如何用 OneToOne 做这件事?我还需要 OneToOneLink.clear() 之类的东西,而我看到的唯一要做的就是设置对 NULL 的引用。
      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多