以前也遇到過這個異常,當時也不知道怎麼做就上網查,這回又再一次的遇到了這個異常了,決心要追根溯源,找到問題的原點。
a different object with the same identifier value was already associated with the session
這個錯誤的意思就是2個不同的對象關聯到了同一個標誌位,也就是說在一個session中存在2個對象,但這 2個對象的標誌位是相同的比如2個對象的 id值是一樣的 而這又是資料庫的唯一主鍵 ,在做更新操作的時候就出現衝突了,因為Hibernate不知道到底要去更新哪個對象 ,所以就報這個異常了。
在網上搜尋給出了這樣的幾個答案
解決方案一: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裡面內建的方法,推薦使用。我的分析:我們通常在程式中這樣編寫時導致這個異常出現的,首先是我們擷取從頁面傳過來的對象,我們叫它vo(view object),然後我們接著調用hibernate的方法查詢資料庫擷取和這個vo主鍵一樣的實體類,我們叫它po,然後我們把po裡的屬性擷取到賦值到vo屬性裡,最後我們調用了hibernate的方法更新vo,這時就報這個異常了。這個出現的原因就是hibernate的session的緩衝中同時存在vo對象和po對象,並且他們倆的ID是一樣的,所以hibernate不知道更新那個了。最後解決方案是,我們操作的是從資料庫中查詢出來的那個實體類po,把要更新的屬性調用po實體類裡的set方法複製,這樣在hibernate的session中就會一直保持一個實體物件,不要完全new一個對象,也不要把vo賦值給實體類,這樣還會報這個錯的。因為給複製或new一個對象後,在hibernate的session中又會有兩個對象了。