Hibernate Error: org.hibernate.NonUniqueObjectException: 具有相同标识符值的不同对象已与会话关联

2022-09-04 23:51:35

可能的重复:
休眠:具有相同标识符值的不同对象已与会话关联

我遇到了几乎与那个用户相同的问题。

在我的情况下,我从数据库加载一个实体,我将这个实体转换为DataTransferObject,然后我想编辑一个属性,之后我将其转换回实体Object,然后我更新该实体并休眠引发以下错误:

Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

显然,问题是我从数据库检索的对象与我要更新的对象具有相同的ID(就像它应该的那样),但这些对象不是相同的对象!

如何管理?感谢您的帮助...


答案 1

您的问题是您之前加载的对象仍然存在于休眠会话中。我看到了两种应对这种情况的方法。

1.) 告诉休眠会话将修改后的对象与会话中的对象合并

session.merge(object)

2.) 在将更新后的对象写入会话之前,将旧对象踢出会话。session.clear() 可能有效。


答案 2

这是Hibernate的一个非常常见的问题。即使您从会话中删除它,该对象也将保留在Hibernate PersistanceContext中,并且您将遇到同样的问题。问题还来自这样一个事实,即section.contains使用对象相等,而不是比较对象...equals()

故事如下:你有对象A和对象B,它们是相同的逻辑对象,但在你的java堆中有两个不同的对象。并且您很久以前就在会话中对对象A做了一些事情。

现在,如果您这样做,您将获得异常,因为您正在尝试删除与A具有相同主键但不是A的对象。session.delete(B)

解决方案很简单:

Object findAAgain=session.merge(B);
session.delete(findAAgain);

合并首先返回会话中对象的实例。


推荐