一尘不染

休眠错误:具有相同标识符值的另一个对象已与会话关联

hibernate

我基本上在此配置中有一些对象(实际数据模型要复杂一些):

  • 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。显然,这不是我们想要的。

[编辑]我忘记提到的另一件事是(由于无法控制的体系结构原因),每次读取或写入都需要在单独的会话中完成。


阅读 240

收藏
2020-06-20

共1个答案

一尘不染

很有可能是因为B对象没有引用相同的Java C对象实例。它们引用数据库中的同一行(即相同的主键),但是它们是数据库的不同副本。

因此,正在发生的事情是,管理实体的Hibernate会话将跟踪哪个Java对象对应于具有相同主键的行。

一种选择是确保引用同一行的对象B的实体实际上引用的是C的同一对象实例。或者,为该成员变量关闭级联。这样,当B持久时,C则不会。不过,您将不得不分别手动保存C。如果C是类型/类别表,那么这样做可能是有道理的。

2020-06-20