【问题标题】:Hibernate: cascaded merge throws detached exceptionHibernate:级联合并引发分离异常
【发布时间】:2014-06-12 06:20:46
【问题描述】:

这似乎是一个关于休眠的热门话题,无论是在 stackoverflow (IllegalStateException with Hibernate 4 and ManyToOne cascading) 和外部 (https://forum.hibernate.org/viewtopic.php?f=1&t=1031016&view=previous) 上,但我仍然不清楚。

我有对象 A,我将它与实体管理器 E1 合并。我关闭E1。 我有对象 B,它引用了我们与 E1 合并的 A 的实例。 B 已级联合并并在 A 上持久化。

我将 B 与 entitymanager E2 合并,然后出现异常“存储实体 [...] 时发生错误。实体副本 [...] 已分配给不同的实体 [...]。”

我所有的搜索似乎表明他们在休眠版本 4.1.3 或类似版本中的某个地方引入了一些额外的检查。事实上,如果我用 4.1.2 运行完全相同的代码,它就可以工作。

额外的检查应该需要正确的 equals() 和 hashCode() 实现,但是我的对象有这些,我已经向它们添加了调试日志记录:它们永远不会被调用。

我可以通过移除级联功能来“解决”它,但是……嗯……很方便……

我该如何解决这个问题,以便级联可以按预期工作?

更新

显然,目前的问题是 B 实际上引用了 A 两次。 所以我假设第二个分离的 A 抛出异常。我可以看到这可能是 B 被合并,A 的第一个实例被附加,第二个抛出异常。

但是,有没有办法强制休眠简单地将重新附加的第一个版本的 A 用于第二个 A?在我的上下文中,很难保证 A 只重新附加一次。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    这似乎是一个已知问题:https://hibernate.atlassian.net/browse/HHH-9106

    没有关于“为什么”这未修复的反馈。

    我已经尝试将 EventCache(这是引发异常的那个)回滚到包含更少检查的 4.1.2 版本。我试过摆弄 DefaultMergeEventListener 无济于事。我没有时间深入挖掘,所以我不得不从我的 @ManyToOne 关系中删除所有级联,以防止出现此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      相关资源
      最近更新 更多