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了

时间: 2024-08-29 06:58:54

Hibernate开发中遇到org.hibernate.NonUniqueObjectException处理的相关文章

Hibernate学习---第九节:Hibernate之hql

一.Hql 入门 1.实体类: package learn.hibernate.bean; import java.util.Date; import java.util.HashSet; import java.util.Set; /** * 持久化类设计 * 注意: * 持久化类通常建议要有一个持久化标识符(ID) * 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值) * 持久化类通常建议手动添加一个无参构造函数 (因为有些操作是通过放射机制进行的) * 属性通

ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解

这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉ibatis xml文件都提供的一些标签,这些标签大部分是用来处理推断.逻辑,使得sql能够动态组装变的更灵活. 在写代码的工作量上ibatis要比hibernate高一些,在你写了服务层后还须要些dao层,dao层实现,然后这些在hibernate中不须要自己写,仅仅写到服务层就能够调用hiber

Hibernate+Spring+Struts2整合开发中的一个分页显示方案(转载)

分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流. 1.DAO层接口的设计,在MemberDao接口中定义了如下两个方法: public interface MemberDao{        //省略了其他的代码        /**     * 分页查询     * @

ibatis 和hibernate 在开发中的理解

这个项目的底层是用ibatis框架完成,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后主要的配置都已经配置好了,比如一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉ibatis xml文件都提供的一些标签,这些标签大部分是用来处理判断.逻辑,使得sql可以动态组装变的更灵活. 在写代码的工作量上ibatis要比hibernate高一些,在你写了服务层后还需要些dao层,dao层实现,然后这些在hibernate中不需要自己写,只写到服务层就可以调用hibern

根据数据库的表生成项目,项目变为hibernate项目(实际开发中常用)

1.  选择模式为Myeclipse Database Explorer perpective 2. (1)右键建立mysql模板,选择默认的mysql模板 (2)drive name (任意这里取mysql) 3.  设置内部URL按照以前的格式填写 4.  添加驱动 就是这个文件夹下的jar包 5.  测试联通 6.  弹出这个输入数据库密码 7.  成功后显示 8.  点击finish,然后就会在工作区产生一个如图所示的文件 9.  双击打开就会看到你的数据库文件了. 10. 找到对应的t

Hibernate开发流程

一:基本开发流程: -->导入jar包,hibernate.jar + required + jpa + 数据库驱动包 -->对实体类进行映射,写配置文件 -->src目录下添加hibernate.cfg.xml文件 数据库相关配置,其他相关配置(是否显示sql,是否自动建表等),映射文件加载 -->测试DAO 二:hibernate程序执行流程 三:hibernate.cfg.xml配置详解 1 <!DOCTYPE hibernate-configuration PUBLI

eclipse从数据库逆向生成Hibernate实体类(eclipse中反向生成hibernate实体类+jpa注释)

eclipse从数据库逆向生成Hibernate实体类 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再"自己"建立一变VO.意思是,在项目设计时,要么根据需求分析建立实体类,由正向生成数据库表:要么就先进行数据库表设计,再逆向生成实体类.没有说进行完任意一方的设计后再去花时间去自己匹配建立另一方的设计. 原因是: 1. 1.5倍工作量,浪费时间.(时间对公司来说很重要) 2. 无法

Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析

Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用. 开启Session Session实例由SessionFactory开启获得,例如: Configuration config = new Configuration().configure(); SessionFact

Jsp标签字典开发_基于Spring+Hibernate

目录 1. Jsp标签字典开发_基于Spring+Hibernate 1.1. 简述 1.2. 定义DictItem实体 1.3. 定义字典的@interface 1.4. 定义字典缓存类 1.5. 定义tld标签 1.6. 持久层实体使用注解 1.7. 页面调用jsp标签 2. 补充点 2.1. Hibernate设置属性成功后扫描字典 2.2. Annotation注解 2.2.1. 简述 2.2.2. 元注解 2.2.3. 自定义注解 1. Jsp标签字典开发_基于Spring+Hiber