Hibernate错误“a different object with the same identifier value was already associated with the session”应该怎么解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (206)

在这个配置中实质上有一些对象(真正的数据模型有点复杂):

  • A与B有多对多的关系(B有inverse="true"
  • B与C有着多对一的关系(已经cascade设定了"save-update"
  • C是一种类型/类别表。

主键是由数据库在保存时生成的。

我有时会遇到问题,其中A有一组不同的B对象,而这些B对象引用同一个C对象。

当我调用session.saveOrUpdate(myAObject),我得到一个休眠错误:"a different object with the same identifier value was already associated with the session: C"。我知道hibernate不能在同一个会话中插入/更新/删除同一个对象两次,但是有没有办法解决这个问题?

在我研究这个问题的过程中,有人建议使用session.merge(),当我这样做时,任何“冲突”的对象都会作为所有值设置为空的空白对象插入到数据库中。

提问于
用户回答回答于

最可能的原因是B对象不是指相同的Java C对象实例。他们指的是数据库中的同一行(即相同的主键),但它们是不同的副本。

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

一种选择是确保引用同一行的对象B的实体实际上是指C的同一对象实例。或者关闭该成员变量的级联。当B坚持时,这种方式C不是。不过你必须手动保存C. 如果C是一个类型/类别表,那么这样做可能是有意义的。

用户回答回答于

所属标签

可能回答问题的人

  • 女淘日记

    杭州吱吱吱科技 · 站长 (已认证)

    1 粉丝1 提问3 回答
  • 朝夕熊博客

    1 粉丝2 提问3 回答
  • 13火麒麟

    1 粉丝0 提问2 回答
  • 找虫虫

    6 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券