解決a different object with the same identifier value was already associated with the session錯誤

   這個錯誤我一共遇到過兩次,一直沒有找到很好的解決方案,這個錯誤產生

原因相信大家都知道,因爲在hibernate中同一個session裏面有了兩個相同標識

但是是不同實體,當這時運行saveOrUpdate(object)操作的時候就會報這個錯誤。

呵呵,也許你會說,你這麼說跟沒說沒什麼區別,我承認,呵呵,我不知道具體

爲什麼會產生這個錯誤,要不然也不會很久都沒有解決,現在,給出一個臨時的

解決方案,給向我一樣,沒有辦法找到根源的人一個能夠繼續執行下去的方法

(當然是對的,只是不是從產生原因入手)

其實要解決這個問題很簡單,只需要進行session.clean()操作就可以解決

了,但是你在clean操作後面又進行了saveOrUpdate(object)操作,有可能

會報出”Found two representations of same collection”,我找了很多資料,

沒有什麼很好的解釋,其中這篇文章幫助最大

http://opensource.atlassian.com/projects/hibernate/browse/HHH-509

最後通過session.refresh(object)方法就可以解決了,注意,當object不

是數據庫中已有數據的對象的時候,不能使用session.refresh(object)因

爲refresh是從hibernate的session中去重新取object,如果session中沒

有這個對象,則會報錯所以當你使用saveOrUpdate(object)之前還需要判

斷一下

當然這個問題最容易解決的辦法還是使用Hibernate裏面自帶的merge()

方法。不過我始終覺得碰到問題就用這種軟件自帶的非常用方法

(和saveOrUpdate(),save(),update()相比)感覺十分不爽。

後來我還發現這種錯誤經常出現在一對多映射和多對多映射,請大家在

使用一對多和多對多映射的時候要小心一些

Hibernate 疑難異常及處理

1、a different object with the same identifier value was already associated with the session。

  錯誤原因:在hibernate中同一個session裏面有了兩個相同標識但是是不同實體。

  解決方法一:session.clean()

  PS:如果在clean操作後面又進行了saveOrUpdate(object)等改變數據狀態的操作,有可能會報出”Found two representations of same collection”異常。

  解決方法二:session.refresh(object)

  PS:當object不是數據庫中已有數據的對象的時候,不能使用session.refresh(object)因爲該方法是從hibernate的session中去重新取object,如果session中沒有這個對象,則會報錯所以當你使用saveOrUpdate(object)之前還需要判斷一下。

  解決方法三:session.merge(object)

  PS:Hibernate裏面自帶的方法,推薦使用。

2、Found two representations of same collection

  錯誤原因:見1。

  解決方法:session.merge(object)

以上兩中異常經常出現在一對多映射和多對多映射中

PS:使用單例,確保使用的是用一個對象也可避免出現這種狀況

轉自:http://www.blogjava.net/hrcdg/articles/157724.html

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