我基本上在这个配置中有一些对象(实际的数据模型有点复杂):
a与b之间存在多对多关系(b有 inverse="true"
)
b与c之间存在多对一关系(我有 cascade
设置为 "save-update"
)
c是一种类型/类别表。
另外,我应该提到,主键是由数据库在保存时生成的。
对于我的数据,我有时会遇到这样的问题: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。显然这不是我们想要的。
[编辑]另一件我忘记提到的事情是(由于我无法控制的体系结构原因),每次读写都需要在单独的会话中完成。
21条答案
按热度按时间h9a6wy2h16#
只需提交当前事务。
现在您可以开始另一个事务并在实体上执行任何操作
pwuypxnk17#
我有这个错误几天去,我加快了太多的时间来修复这个错误。
在我得到这个错误之前,我没有提到orderdetil对象的id生成类型。如果不生成orderdetails的id,它会将每个orderdetail对象的id保持为0。这就是jbx所解释的。是的,这是最好的答案。这是它如何发生的一个例子。
wwwo4jvm18#
使用以下命令将对象id从hibernate分配到数据库:
这为我解决了问题。
ia2d9nvy19#
解决上述问题的一种方法是重写
hashcode()
.同时在保存之前和之后刷新休眠会话。
将分离的对象显式设置为
null
也有帮助。xriantvc20#
如果使用entityrepository,则使用saveandflush而不是save
v09wglhw21#
尝试将查询的代码放在前面。解决了我的问题。e、 g.更改此项:
对此: