org.hibernate.NonUniqueObjectException 个人的解决办法

xiaoxiao2022-06-13  20

用hibernate做修改和删除的时候,有时候会遇到 org.hibernate.NonUniqueObjectException 异常,

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

可以解释为 有一个具有相同值的不同对象已经与和 session 相关联。

 

google了哈,http://www.blogjava.net/Unmi/archive/2007/08/10/135771.html 的办法是:

重现以上错误的代码如下(去除了事物控制的代码行):  1. Session session = HibernateSessionFactory.getSession();     2.     3. // 加载OID为1L的对象,会被放在session缓存中     4. LoanDetail detail = (LoanDetail)session.get(LoanDetail.class,1L);     5.     6. // new 一个OID也为1L的临时对象     7. LoanDetail newDetail = new LoanDetail(1L);     8. ewDetail.setSubjectId(1000L);     9.     10. // 持久化一个临时对象,试图放在session的缓存中,因OID冲突出现异常     11. session.save(newDetail);     12.     13. // 执行saveOrUpdate同样会出现以上的异常     14. // session.saveOrUpdate(newDetail);  

解决方法:   1) 如果用的 hibernate 2, 需要在get/load/query到持久化对象,赋上新的属性值,再 save/update/saveOrupdate.   对以上代码就是:不能 new 一个session中已存在OID的对象,直接   detail.setSubjectId(1000L);   session.save(detail);   session.save()一个持久化对象时,会转化成update调用。   2) 使用 hibernate 3 的 merge 方法. session.merge(newDetail)即可,它会在 session 缓存中找到持久化对象,把新对象的属性赋过去,再保存原session中的持久化对象。   如果在session或数据库中没有的对象,用merge方法的话,它也能够帮你把记录 insert 到表中,相当于 save 方法。

我有试了2种办法:

  1) 在 session.update/delete/saveOrUpdate 前,先 session.clear();

  2) 在 session.update/delete/saveOrUpdate 后,关闭session:session.close();

 

 

相关资源:敏捷开发V1.0.pptx
转载请注明原文地址: https://www.6miu.com/read-4936243.html

最新回复(0)