Hibernate学习笔记 - Session.evict(user)方法
2015-04-06 08:56
337 查看
作用:从session缓存(EntityEntries属性)中逐出该对象,但是与commit同时使用,会抛出异常 !
Java代码
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("李四");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//利用Hibernate将实体类对象保存到数据库中
//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
session.save(user);
session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
//无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。
tx.commit();
解决在逐出session缓存中的对象不抛出异常的方法:
在session.evict()之前进行显示的调用session.flush()方法就可以了。
/利用Hibernate将实体类对象保存到数据库中
//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
session.save(user);
//flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false
session.flush();
session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
//可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。
tx.commit();
Java代码
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User1 user = new User1();
user.setName("李四");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//利用Hibernate将实体类对象保存到数据库中
//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
session.save(user);
session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
//无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。
tx.commit();
解决在逐出session缓存中的对象不抛出异常的方法:
在session.evict()之前进行显示的调用session.flush()方法就可以了。
/利用Hibernate将实体类对象保存到数据库中
//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
session.save(user);
//flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false
session.flush();
session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
//可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。
tx.commit();
相关文章推荐
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
- Hibernate学习笔记----session核心方法
- Hibernate学习笔记(四)----核心开发接口、对象的三种状态、session常用方法
- 【学习笔记】Hibernate中对象的状态和转换以及Session的主要方法总结
- Hibernate学习--- Session.evict()方法
- Hibernate Session 方法学习笔记
- Hibernate学习笔记之Session-API实现CRUD以及get&load&merge方法
- Hibernate学习笔记 merge()方法--update 之补充
- {传智播客} (学习笔记)--Hibernate的Session缓存问题与理解
- (hibernate之三)session的delete方法(转的学习用)
- hibernate学习笔记3----hibernate中的session接口介绍
- Hibernate学习篇11——session方法之save与persist
- 传智播客hibernate学习,Session的方法和关联映射
- Hibernate中session的clear(),flush(),evict()方法详解
- 框架学习之Hibernate 第三节 session接口以及get/load/persist方法
- Hibernate中session的clear(),flush(),evict()方法详解
- Hibernate学习笔记:session操作对象
- struts2学习笔记--获取Session和request方法
- hibernate获取session的两个方法(笔记)
- Hibernate学习篇12——session方法之save与update