2010-08-31 67 views
9

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作为一个我想更新(如它应该是),但这些都是不一样的对象!

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

回答

24

你的问题是,你以前加载的对象在Hibernate会话仍然存在。我看到了两种方式来解决这个问题。

1)告诉Hibernate的Session更新的对象写会话之前与一个合并修改后的对象在会话

session.merge(object) 

2)踢旧的对象了会议。 session.clear()可能工作。

+2

合并()不适合我。我尝试清除()并驱逐(对象)成功 – Silentbang 2014-02-18 08:49:52

+0

@Silentbang。是的,我必须同时做'clear()'和'evict(object)'。看起来像一个人或另一个人应该工作,但都需要。 – 2017-05-02 14:53:07

2

选择任意一个:

1 - 你可以在加载实体后关闭会话和更新

打开新的会话

2 - 而不是用于更新制作新的实体,使用旧的并编辑它。

3 - 从会话脱离你的第一个实体 - session.evict(myEntity)

+0

谢谢你的想法,但我不想关闭会话,我的架构不会让我更新旧对象(除了很多努力) – Sven 2010-08-31 14:20:20

+0

@Sven你可以分离实体吗? – mhshams 2010-08-31 14:26:34

+0

不起作用:javax.servlet.ServletException:org.hibernate.SessionException:Session关闭! – Sven 2010-09-01 06:42:02

0

不仅仅是呼吁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?如果是这样,那么你应该找到一个不同的领域,唯一标识不同的实体。

+0

不,它们是相同的逻辑对象/相同的实体,但java给它们不同的对象ID – Sven 2010-09-01 06:18:32

+0

''怎么产生?你使用什么方案? – 2010-09-01 11:48:08

11

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

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

现在如果你做session.delete(B)你会得到这个异常,因为你试图删除一个与A有相同主键但不是A的对象。

解决方法很简单:

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

合并将返回会话具有第一对象的实例。

相关问题