【发布时间】: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 只重新附加一次。
【问题讨论】: