你的位置:首页 > Java教程

[Java教程]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了