hibernate報錯a different object with the same identifier value was already associated with the session

來源:互聯網
上載者:User

以前也遇到過這個異常,當時也不知道怎麼做就上網查,這回又再一次的遇到了這個異常了,決心要追根溯源,找到問題的原點。

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中又會有兩個對象了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.