码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate开发中遇到org.hibernate.NonUniqueObjectException处理

时间:2015-04-19 15:56:17      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

今天在项目中遇到更新数据的操作,在编码中发现并未报错,但数据并未得到更新,于是花了大半时间找是什么问题,最后发现是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开发中遇到org.hibernate.NonUniqueObjectException处理

标签:

原文地址:http://www.cnblogs.com/moonou/p/4439224.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!