org.hibernate.NonUniqueObjectException: a different object with the same identifier value was ...

問題:org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:……

        主鍵不唯一,在事務的最後執行SQL時,session緩存裏面有多個(>1)主鍵一樣的對象。


原因:瞭解過hibernate的都知道它有一個一級緩存,即session級別的緩存,在一個事務的執行過程中可以管理持久化對象,在事務最後執行SQL,可以減少數據庫的操作。


可能的場景:

1、同一個object,如一個person在seession裏保存了一份,而增加的別的object,如company的時候,由於做了關聯關係,從數據庫裏又get了一個person,而這個person和seession裏的person是同一個,把get出來的person   set 到了company裏,像這樣,compnay.setPerson(person).在增加company的時候就出現了這個錯誤。

2、在同一個session內,如果已經有一個對象已經是持久化狀態(load進來等),現在構造一個新的PO,和前一個持久化對象擁有相同的持久化標識(identifier),在update的時候,就會拋這個錯誤。如:

User user1 = session.load(1);
User user2 = new User();
user2.setId(1);//此時ID和user1一樣
user2.setUsername("lalala");
session.update(user2);//這裏會拋出錯誤


3、。。。。。


解決辦法:

1.不要重新new一個對象,使用load的對象對他進行更改值。
例如上面例子直接對user1操作,最後更新user1
2.如果是hibernate3以上,可以使用session.merge()方法
3.把session中同標識的對象移出(session.evict(user1)),使他成爲脫管的狀態,然後user2就可以update了。


參考http://fatkun.com/2011/04/org-hibernate-nonuniqueobjectexception.html


發佈了30 篇原創文章 · 獲贊 10 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章