首页  >  文章  >  Java  >  为什么我在 Hibernate 中收到“具有相同标识符的重复对象”异常?

为什么我在 Hibernate 中收到“具有相同标识符的重复对象”异常?

Susan Sarandon
Susan Sarandon原创
2024-10-28 22:16:02157浏览

 Why am I getting a

Hibernate 异常:具有相同标识符的重复对象

问题:

使用 session.saveOrUpdate(e) 时与其他实体有关系的对象,可能会抛出异常,指示“具有相同标识符值的不同对象已与会话关联。”

说明:

当 Hibernate 在单个会话中检测到具有相同标识符的同一实体的多个实例时,会发生此异常。下面是该情况的简化说明:

  • 实体 A (rolebean) 与实体 B (userbean) 和实体 C (groupbean) 关联。
  • 在实体 B 上调用 saveOrUpdate 时, Hibernate 将实体 A 保存为实体 B 关系的一部分。
  • 稍后,当对实体 C 调用 saveOrUpdate 时,Hibernate 会再次尝试保存实体 A,但作为单独的实例。

解决方案:

解决方案取决于所需的行为:

1.通过合并维护关系:

为了防止重复实例,请使用 session.merge(e) 而不是 saveOrUpdate。合并假设实体的分离实例(在本例中为实体 A)应附加到会话,并且任何更改都应合并到附加版本中。

2.确保分配的一致性:

如果要继续使用 saveOrUpdate,请确保将实体的相同实例分配给所有相关实体。这意味着当将实体 A 添加到实体 B 和实体 C 的关系时,应使用实体 A 的同一实例。

示例:

<code class="java">// Ensuring the same instance of rolebean is assigned to both userbean and groupbean
rolebean.setUserbean(userbean);
groupbean.getGroups().add(rolebean);</code>

注意:

具体修复取决于执行分配的代码。建立关系时必须确保使用相同的实体实例,以避免重复对象问题。

以上是为什么我在 Hibernate 中收到“具有相同标识符的重复对象”异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn