evict和clear
看了一下源码与API,
session.evict(obj),会把指定的缓冲对象进行清除
session.clear(),把缓冲区内的全部对象清除,但不包括操作中的对象
所以,hibernate执行的顺序如下,
(1)生成一个事务的对象,并标记当前的Session处于事务状态(注:此时并未启动数据库级事务)。
(2)应用使用s.save保存对象,这个时候Session将这个对象放入entityEntries,用来标记对象已经和当前的会话建立了关联,由于应用对对象做了保存的操作,Session还要在insertions中登记应用的这个插入行为(行为包括:对象引用、对象id、Session、持久化处理类)。
(3)s.evict将对象从s会话中拆离,这时s会从entityEntries中将这个对象移出。
(4)事务提交,需要将所有缓存flush入数据库,Session启动一个事务,并按照insert,update,……,delete的顺序提交所有之前登记的操作(注意:所有insert执行完毕后才会执行update,这里的特殊处理也可能会将你的程序搞得一团糟,如需要控制操作的执行顺序,要善于使用flush),现在对象不在entityEntries中,但在执行insert的行为时只需要访问insertions就足够了,所以此时不会有任何的异常。异常出现在插入后通知Session该对象已经插入完毕这个步骤上,这个步骤中需要将entityEntries中对象的existsInDatabase标志置为true,由于对象并不存在于entityEntries中,此时Hibernate就认为insertions和entityEntries可能因为线程安全的问题产生了不同步(也不知道Hibernate的开发者是否考虑到例子中的处理方式,如果没有的话,这也许算是一个bug吧),于是一个net.sf.hibernate.AssertionFailure就被抛出,程序终止
一般错误的认为s.save会立即的执行,而将对象过早的与Session拆离,造成了Session的insertions和entityEntries中内容的不同步。所以我们在做此类操作时一定要清楚Hibernate什么时候会将数据flush入数据库,在未flush之前不要将已进行操作的对象从Session上拆离。
解决办法是在save之后,添加session.flush。
以下这篇文章,可以解决你一部分的疑问:
http://hi.baidu.com/lkdlhw_2000/blog/item/a35b9cca82945342f31fe769.html
不过在事务里做这个evict或clear,这事件本来就是不太合理的事情呀
evict和clear相关推荐
- Hibernate一级缓存管理-evict和clear的用法
evict方法:从一级缓存中移除一个对象 clear方法:将一级缓存中的对象全部移除 /*** 验证缓存管理的方法evict* 执行完evict之后,将会将id为5的user对象从一级缓存中移除,再次 ...
- Hibernate学习(4)- Hibernate对象的生命周期
1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联: 2.持久化状态(P ...
- hibernate笔记--缓存机制之 一级缓存(session缓存)
一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...
- 菜鸟学SSH(八)——Hibernate对象的三种状态
前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...
- Hibernate 对象的三种状态
Hibernate 对象的三种状态 瞬时(transient): 由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时(Transient)的.瞬时(Transient ...
- Hibernate中主键生成策略
主键生成策略 increment identity sequence native uuid assigned 1) increment 由hibernate完成 主键递增, 原理:select ma ...
- Hibernate缓存和加强
Hibernate缓存和加强 懒加载 懒加载(Load On Demand)是一种独特而又强大的数据获取方法 ,是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较 ...
- 缓存设计方案 你了解吗 SpringBoot 快速集成实现一级缓存Redis和二级缓存Caffeine 可自定义扩展
项目背景: 在系统初期为了实现业务的快速增长.对系统没有很好的设计.后期想实现缓存,提升应用系统的性能. 面临问题: 缓存配置混乱.系统微服务化基本上需要实现缓存.序列化方式不统一 研发效率低下.每次 ...
- javaWeb三大框架总结
一.Struts2的总结 1.Struts 2的工作流程,从请求说起 (1)客户端浏览器发出HTTP请求. (2)根据web.xml配置,该请求被FilterDispatcher接收. (3)根据st ...
最新文章
- php修改后nginx返回不生效,nginx修改配置后不生效的问题
- 架构 encoder_一种新的超分模型蒸馏架构 (ECCV2020)
- ember.js mysql_用AWS部署ember.jspadrino应用系列之一
- Highlighting System
- python建立矩阵原理_怎么用python建立矩阵-问答-阿里云开发者社区-阿里云
- 一个普通二叉树的遍历
- iOS开发过程中常见错误问题及解决方案
- javascript原型和原型链
- Python学习笔记(语句)
- spring cloud gateway java.lang.IllegalStateException:Only one connection receive subscriber allowed.
- JavaScript---BOM和DOM
- 冰点还原精灵如何卸载
- QQ登录界面实现代码
- 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)
- 两年内广州城中村全围闭 将施行“门禁”准则
- 数据结构算法实现-顺序表基本操作
- agsXMPP + Openfire 即时通讯开发(二) 【文件传输】
- 华为总裁任正非新年致辞:没什么能阻挡前进
- PS使用技巧(二) 选框工具 M
- 电脑之间互相ping,只有一方可以ping通