Hibernate开发中遇到org.hibernate.NonUniqueObjectException处理
今天在项目中遇到更新数据的操作,在编码中发现并未报错,但数据并未得到更新,于是花了大半时间找是什么问题,最后发现是try的时候直接把异常吞了(= =!!血的教训呐)!
排查后发现抛出一个异常org.hibernate.NonUniqueObjectException,通过反复检查和度娘的结果发现,原来是下面的代码出错
Session session = HibernateSessionFactory.getSession(); session.getTransaction().begin(); try{ Query hql = session.createQuery("from News where idnews = :id"); hql.setParameter("id", news.getIdnews()); News n = (News) hql.list().get(0); news.setCreatetime(n.getCreatetime()); news.setTitle(n.getTitle()); news.setIslive(n.getIslive()); session.saveOrUpdate(news); return true; } catch(Exception e){ return false; } finally{ session.getTransaction().commit(); HibernateSessionFactory.closeSession(); }
原来是因为在Hibernate中同一个session内,如果已经有一个对象已经是持久化状态(load进来等),现在构造一个新的PO,和前一个持久化对象拥有相同的持久化标识(identifier),在update的时候,就会抛这个错误。参考http://fatkun.com/2011/04/org-hibernate-nonuniqueobjectexception.html感谢原文作者
我的解决方法,使用传入的news对象去设置获取的n对象值。
上面链接中提供了一下解决方法
1.不要重新new一个对象,使用load的对象对他进行更改值。
2.如果是hibernate3以上,可以使用session.merge()方法
3.把session中同标识的对象移出(session.evict(user1)),使他成为脱管的状态,然后user2就可以update了