我基本上在这个配置中有一些对象(实际的数据模型稍微复杂一点):
类别A与B具有多对多关系。(B与inverse="true"
)
cascade
设置为"save-update"
)
另外,我可能应该提一下,主键是由数据库在保存时生成的。
对于我的数据,我有时会遇到这样的问题:A有一组不同的B对象,而这些B对象引用相同的C对象。
当我调用session.saveOrUpdate(myAObject)
时,我得到一个hibernate错误:"a different object with the same identifier value was already associated with the session: C"
。我知道hibernate不能在同一个会话中两次插入/更新/删除同一个对象,但是有什么方法可以解决这个问题吗?这看起来并不是什么不常见的情况。
在我研究这个问题的过程中,我看到有人建议使用session.merge()
,但当我这样做时,任何“冲突”的对象都会作为所有值都设置为null的空白对象插入数据库。很明显,这不是我们想要的。
编辑我忘记提到的另一件事是(由于我无法控制的架构原因),每次读或写都需要在单独的会话中完成。
发布于 2013-04-27 07:57:04
这很可能是因为B对象引用的不是同一个Java C对象实例。它们引用数据库中的同一行(即相同的主键),但它们是它的不同副本。
因此,正在发生的事情是,管理实体的Hibernate会话将跟踪哪个Java对象对应于具有相同主键的行。
一种选择是确保引用同一行的对象B的实体实际上引用了C的相同对象实例。或者,关闭该成员变量的级联。这样,当B被持久化时,C就不是了。不过,您必须手动单独保存C。如果C是一个类型/类别表,那么这样做可能是有意义的。
发布于 2015-08-09 05:21:52
只需将cascade设置为MERGE,就可以了。
发布于 2014-09-18 15:55:44
你只需要做一件事。运行session_object.clear()
,然后保存新对象。这将清除会话(命名恰当),并从会话中删除有问题的重复对象。
https://stackoverflow.com/questions/16246675
复制相似问题