休眠错误:org.hibernate.NonUniqueObjectException:不同的对象具有相同标识符值已与会话
Possible Duplicate:
Hibernate: different object with the same identifier value was already associated with the session休眠错误:org.hibernate.NonUniqueObjectException:不同的对象具有相同标识符值已与会话
我已经得到了几乎一样,user同样的问题有关。我将这个实体转换为DataTransferObject,然后我想编辑一个属性,之后我将它转换回一个entityObject,然后我更新该实体,并且hibernate抛出下面的错误:
Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
显然,问题是,我从数据库中检索对象具有相同的ID作为一个我想更新(如它应该是),但这些都是不一样的对象!
如何管理? 感谢您的帮助...
你的问题是,你以前加载的对象在Hibernate会话仍然存在。我看到了两种方式来解决这个问题。
1)告诉Hibernate的Session更新的对象写会话之前与一个合并修改后的对象在会话
session.merge(object)
2)踢旧的对象了会议。 session.clear()可能工作。
选择任意一个:
1 - 你可以在加载实体后关闭会话和更新
打开新的会话2 - 而不是用于更新制作新的实体,使用旧的并编辑它。
3 - 从会话脱离你的第一个实体 - session.evict(myEntity)
不仅仅是呼吁clear()
的会议,这听起来像你可能有你正在使用Hibernate的方式有问题:
Apparently, the problem is that the object I retrieve from db has the same id as the one I want to update (like it should be) BUT those are not the same objects!
你的意思是说,你必须具有相同的两个不同的实体ID?如果是这样,那么你应该找到一个不同的领域,唯一标识不同的实体。
不,它们是相同的逻辑对象/相同的实体,但java给它们不同的对象ID – Sven 2010-09-01 06:18:32
'
这是Hibernate非常常见的问题。即使你从会话中删除它,对象也会留在Hibernate PersistanceContext中,并且你也会遇到同样的问题。问题也来自session.contains使用对象相等的事实,而不是equals()
来比较对象...
故事如下:您有对象A和对象B,它们是相同的逻辑对象,但在你的java堆中有两个不同的对象。而且你很久以前在会话中用对象A做了一些事情。
现在如果你做session.delete(B)
你会得到这个异常,因为你试图删除一个与A有相同主键但不是A的对象。
解决方法很简单:
Object findAAgain=session.merge(B);
session.delete(findAAgain);
合并将返回会话具有第一对象的实例。
合并()不适合我。我尝试清除()并驱逐(对象)成功 – Silentbang 2014-02-18 08:49:52
@Silentbang。是的,我必须同时做'clear()'和'evict(object)'。看起来像一个人或另一个人应该工作,但都需要。 – 2017-05-02 14:53:07