这似乎是一个关于hibernate的热门话题,无论是在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有级联合并& amp;坚持A。
我将B与entitymanager E2合并,我得到异常"存储实体时发生错误[...]。实体副本[...]已分配给不同的实体[...]。"
我所有的搜索似乎表明他们在hibernate 4.1.3版本或其他地方引入了一些额外的检查。事实上,如果我使用4.1.2运行完全相同的代码,它就可以工作。
额外的检查应该包含一个正确的equals()和hashCode()实现,但是我的对象有这些并且我已经添加了调试日志记录:它们永远不会被调用。
我可以解决"通过删除级联功能,但......好吧......它很方便......
如何解决此问题,以便级联可以按预期工作?
更新
显然,目前的问题是B实际上引用了A 两次。 所以我假设第二个分离的A抛出异常。我可以看到B是如何合并的,A的第一个实例被附加,第二个实例抛出异常。
然而,没有办法强制hibernate简单地使用重新连接的第一个版本的A为第二个A?在我的背景下,很难保证A只重新连接一次。
答案 0 :(得分:0)
这似乎是一个众所周知的问题:https://hibernate.atlassian.net/browse/HHH-9106
没有关于“为什么”没有修复的反馈。
我已经尝试将EventCache(抛出异常的那个)回滚到4.1.2版本,其中包含的检查要少得多。我试过摆弄DefaultMergeEventListener无济于事。我没有时间深入挖掘所以我不得不从@ManyToOne关系中删除所有级联,以防止此问题弹出。