看了一下源码与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相关推荐

  1. Hibernate一级缓存管理-evict和clear的用法

    evict方法:从一级缓存中移除一个对象 clear方法:将一级缓存中的对象全部移除 /*** 验证缓存管理的方法evict* 执行完evict之后,将会将id为5的user对象从一级缓存中移除,再次 ...

  2. Hibernate学习(4)- Hibernate对象的生命周期

    1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联: 2.持久化状态(P ...

  3. hibernate笔记--缓存机制之 一级缓存(session缓存)

    一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...

  4. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

  5. Hibernate 对象的三种状态

    Hibernate 对象的三种状态 瞬时(transient): 由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时(Transient)的.瞬时(Transient ...

  6. Hibernate中主键生成策略

    主键生成策略 increment identity sequence native uuid assigned 1) increment 由hibernate完成 主键递增, 原理:select ma ...

  7. Hibernate缓存和加强

    Hibernate缓存和加强 懒加载 懒加载(Load On Demand)是一种独特而又强大的数据获取方法 ,是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较 ...

  8. 缓存设计方案 你了解吗 SpringBoot 快速集成实现一级缓存Redis和二级缓存Caffeine 可自定义扩展

    项目背景: 在系统初期为了实现业务的快速增长.对系统没有很好的设计.后期想实现缓存,提升应用系统的性能. 面临问题: 缓存配置混乱.系统微服务化基本上需要实现缓存.序列化方式不统一 研发效率低下.每次 ...

  9. javaWeb三大框架总结

    一.Struts2的总结 1.Struts 2的工作流程,从请求说起 (1)客户端浏览器发出HTTP请求. (2)根据web.xml配置,该请求被FilterDispatcher接收. (3)根据st ...

最新文章

  1. php修改后nginx返回不生效,nginx修改配置后不生效的问题
  2. 架构 encoder_一种新的超分模型蒸馏架构 (ECCV2020)
  3. ember.js mysql_用AWS部署ember.jspadrino应用系列之一
  4. Highlighting System
  5. python建立矩阵原理_怎么用python建立矩阵-问答-阿里云开发者社区-阿里云
  6. 一个普通二叉树的遍历
  7. iOS开发过程中常见错误问题及解决方案
  8. javascript原型和原型链
  9. Python学习笔记(语句)
  10. spring cloud gateway java.lang.IllegalStateException:Only one connection receive subscriber allowed.
  11. JavaScript---BOM和DOM
  12. 冰点还原精灵如何卸载
  13. QQ登录界面实现代码
  14. 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)
  15. 两年内广州城中村全围闭 将施行“门禁”准则
  16. 数据结构算法实现-顺序表基本操作
  17. agsXMPP + Openfire 即时通讯开发(二) 【文件传输】
  18. 华为总裁任正非新年致辞:没什么能阻挡前进
  19. PS使用技巧(二) 选框工具 M
  20. 电脑之间互相ping,只有一方可以ping通

热门文章

  1. Java BMI计算程序
  2. 高端论坛| 龚健雅院士:摄影测量与深度学习
  3. 忽如一夜春风来,千树万树梨花开
  4. 淘宝运营 钻展、智钻的定义 优势所在
  5. 考华为云认证要做什么准备,怎么做题库?
  6. 汉源高科24个千兆光口光纤汇聚交换机机架式工业级以太网交换机环网管理型交换机
  7. 【.NET框架实战】IdentityServer4身份验证、授权
  8. 【Pyecharts50例】GEO图中忽略不存在的位置
  9. 支持百亿数据场景,海量高性能列式数据库HiStore技术架构解析
  10. android系统文件误删,误删手机系统文件怎么恢复