2010-08-31 45 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); 

合併將返回會話具有第一對象的實例。

相關問題