在Hibernate的session中同时有两个相同id的同类型对象,修改失败

若在Hibernate的session中同时有两个相同id的同类型对象,修改会失败,报错:a different object with the same identifier value was already

解决方案:

使用merge()

如下情景:

User u = dao.getUser(...) ;

User u2 = ... ;

u2.setId(u.getId()) ; //此时的session中就有了两个id一样的对象了,

dao.update(u2) ; //这里就会报错了,

dao.merge(u2) ; //这样就行了

时间: 2024-12-11 07:45:27

在Hibernate的session中同时有两个相同id的同类型对象,修改失败的相关文章

hibernate架构之session中get与load方法的区别

hibernate是一个用于连接数据库的升级版JDBC,与一般JDBC不同的是,hibernate架构是通过hql进行查找,通过session建立连接.其工作原理是:将实例分为瞬时状态.持久状态.游离状态,通过hql对持久状态的实例进行CRUD.在学习的过程中我们遇到了这样的一个现象:用Session对象调用get()方法和load()方法获取对象时,类似的代码会分为两种结果,get方法运行成功,load方法会报错,代码示例如下: get()方法源代码: Session session= Hib

hibernate session中的load与get

一.get不支持lazy,load支持lazy. 二.采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常. 三.执行load()时,先从Session查找当前的对象是否存在,如果不存在,则从数据库中去查询,如果不存在这条记录,则扔异常:执行get()的时候,不论Session中是否存在当前对象,直接从数据库中去查询,如果不存在,则返回null. 四.load()方法可以返回实体的代理类实例,而get()永远只返回实体类. get的例子: public void testG

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

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

session中存在两个对象,同一个标识符

其实很简单,页面得到对象A,经过数据库查重,session中存在一对象B,AB比较之后发现不同存入数据库,保存的是A然后就出现这个异常.保存A就是把A先写入session再保存 解决办法,1,把B销毁,再保存A(session.clear()) 2,  把A属性copy到B,再保存B(推荐,因为第一种是很蠢)BeanUtils.copy(A,B); session中存在两个对象,同一个标识符,布布扣,bubuko.com

Hibernate的session一级缓存

一级缓存是Session周期的,当session创建的时候就有,当session结束的时候,缓存被清空 当缓存存在的时候,每次查询的数据,都会放在缓存中,如果再次查询相同的数据,则不会再次查询数据库,可以有效的减少数据库的访问量. 但是,session的生命周期很短,当session创建,进行数据库操作后,就会被关闭,同样的,缓存就会被清空.如果是在javaweb中,session的生命周期,就是浏览器向服务器的一次请求.所以,后面hibernate会有相应的二级缓存 操作缓存的几个方法介绍 一

Hibernate管理Session和批量操作

Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hibernate委托程序管理Session对象的生命周期 在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Session管理方式,可选值包括 thread:Session对象的生命周期与本地线程绑定 jta*:Session对象的生

Hibernate的Session使用

Session:用来执行被持久化的增删查改操作,与数据库进行交互:Session对象是非线程安全的. SessionFactory:用来负责初始化Hibernate.充当数据源的代理,并负责创建Session对象.线程安全的全局对象,只需要被实例化一次. Transaction:负责事务相关的操作. Query/Criteria:负责执行各种数据库查询操作,可以使用HQL和SQL语句两种表达方式. Configuration:负责配置并启动Hibernate,创建SessionFactory对象

hibernate 创建session

//1. 创建一个 SessionFactory 对象 SessionFactory sessionFactory = null; //1). 创建 Configuration 对象: 对应 hibernate 的基本配置信息和 对象关系映射信息 Configuration configuration = new Configuration().configure(); //4.0 之前这样创建// sessionFactory = configuration.buildSessionFacto

Hibernate的session详解

一.hibernate的session介绍 Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应.Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush).也叫一级缓存.在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 且没有清理缓存,则存放在它缓存中的对象也不