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了

你可能感兴趣的:(Hibernate)