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了

posted @ 2015-04-19 15:27  木偶M  阅读(8628)  评论(0编辑  收藏  举报