Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate错误:org.Hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联_Java_Hibernate_Orm - Fatal编程技术网

Java Hibernate错误:org.Hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联

Java Hibernate错误:org.Hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联,java,hibernate,orm,Java,Hibernate,Orm,可能重复: 我几乎遇到了同样的问题 在我的情况下,我从db加载一个实体,将该实体转换为DataTransferObject,然后我想编辑一个属性,然后将其转换回entityObject,然后更新该实体,hibernate抛出以下错误: Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated w

可能重复:

我几乎遇到了同样的问题

在我的情况下,我从db加载一个实体,将该实体转换为DataTransferObject,然后我想编辑一个属性,然后将其转换回entityObject,然后更新该实体,hibernate抛出以下错误:

Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
显然,问题在于我从db中检索到的对象与我想要更新的对象具有相同的id(就像应该的那样),但它们不是相同的对象

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

选择其中一个:

1-您可以在加载实体后关闭会话,并打开新会话进行更新

2-使用旧实体并对其进行编辑,而不是创建新实体进行更新


3-从会话中分离第一个实体-
会话。退出(myEntity)

您的问题是之前加载的对象仍然存在于hibernate会话中。我认为有两种方法可以解决这个问题

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

session.merge(object)

2.)在将更新的对象写入会话之前,将旧对象从会话中踢出。session.clear()可能会起作用。

除了在会话中调用
clear()
之外,听起来您使用Hibernate的方式可能有问题:

显然,问题在于我从db中检索到的对象与我想要更新的对象具有相同的id(就像应该的那样),但它们不是相同的对象


您的意思是说您有两个具有相同ID的不同实体吗?如果是这样,那么您应该找到一个唯一标识不同实体的不同字段。

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

故事如下:对象A和对象B是同一个逻辑对象,但java堆中有两个不同的对象。很久以前,您在会话中对对象A做了一些操作

现在,如果执行
session.delete(B)
操作,则会出现异常,因为您试图删除的对象与A具有相同的主键,但不是A

解决方案很简单:

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

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

感谢您的想法,但我不想关闭会话,而且我的体系结构不允许我更新旧对象(除了大量工作之外)@Sven您可以从会话中分离实体吗?不工作:javax.servlet.ServletException:org.hibernate.SessionException:会话已关闭!不,它们是相同的逻辑对象/相同的实体,但java为它们提供了不同的对象id。显示生成的是
s吗?你在使用什么方案?merge()对我不起作用。我尝试了clear()并用success@Silentbang. 是的,我必须同时执行'clear()'和'execute(object)`。似乎一个或另一个单独应该工作,但两者都需要。这真的很有帮助。我试过session.execute()很多次都没有成功。