org.hibernate.NonUniqueObjectException 異常


在做hibernate修改和刪除的時候,可能會遇到 org.hibernate.NonUniqueObjectException 異常,a different object with the same identifier value was already associated with the session 這個問題的出現 主要是當前狀態下有一個具有相同值的不同對象已經與和 session 相關聯了。

就好比:

Session session = HibernateSessionFactory.getSession();  
 // 加載Student 的對象,會被放在session緩存中  
 Student s = (Student )session.get(Student .class,1);

//然后你在需求時沒有注意session中存在了s這么一個對象,而你又繼續

Student s1= new Student(1);

s1.setStatus("22");

// 此后你打算保存或者更新持久化一個臨時對象,試圖放在session的緩存中,因id沖突出現異常  
 session.save(s1);  
  
 // 執行saveOrUpdate同樣會出現以上的異常  
session.saveOrUpdate(s1);
  

 

解決方法是:

你不需要再new一個Student了,你只需要先從session中取出緩存的Student對象,

然后

根據你的需求分別設值

 Student s = (Student )session.get(Student .class,1);或者其他方式取得對象。。。

s.setStatus("22");

session.save(s);//session.update(s);其實save中數據庫存在它會自動轉為update

總之,就是需要在get/load/query到持久化對象,賦上新的屬性值,再 save/update/saveOrupdate.

另外的一種方法是:

使用 hibernate 3 的 merge 方法. session.merge(s1)即可,它會在 session 緩存中找到持久化對象,把新對象的屬性賦過去,再保存原session中的持久化對象。
 如果在session或數據庫中沒有的對象,用merge方法的話,它也能夠幫你把記錄 insert 到表中,相當於 save 方法。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM