Hibernate中evict方法和clear方法说明

  先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务。结果报错:

Exception in thread "main" org.hibernate.AssertionFailure: possible nonthreadsafe access to session。如果

用的不是evict方法,而是clear方法来清session缓存的话,就不会报错。

1.session.evict(obj);

    明显是清除缓冲中指定的对象。

2.session.clear();

    没带参数,是清除掉缓冲区中所有的对象,但不包含当前对象。

3.hibernate执行的顺序如下

  (1)生成一个事务的对象,并标记当前的session处于事务状态(此时并未启动数据库级事务)

  (2)应用使用session.save保存对象,这个时候session将这个对象放入EntityEntries,用来标记对象以及和当前的会话建立了关联,由于应用对对象做个保存的操作,

session还要在insertions中登记应用的这个插入行为(行为包括:对象引用,对象id,session,持久化处理类)。

  (3)session.evict方法将对象从session会话中清除,这时session会从EntityEntries中将这个对象移出。

  (4)事务提交需要将所有缓存flush入数据库,Session启动一个事务,并按照insert,update,……,delete的顺序提交所有值钱登记的操作(注意:所有insert执行完毕后才会执行

update,这里的特殊处理也可能会将程序搞坏,如果需要控制操作的执行顺序,要善于使用flush),现在对象不再EntityEntries中,但在执行insert的行为时只需要访问insertions就够了,

所以此时不会有任何异常。异常出现在插入后通知session该对象已经插入完毕这个步骤上,这个步骤中需要将EntityEntries中对象的existsInDatabase标志置为true,由于对象并不存在于

EntityEntries中,此时Hibernate就认为insertions和EntityEntries可能因为线程安全问题产生了不同步,于是抛出一个net.sf.hibernate.AssertionFailure,导致程序终止。

  一般错误的认为session.save会立即执行,而将对象过早的从session中清除,造成session的insertions和EntityEntries中内容的不同步。所有我们在做此类操作时一定要明白

Hibernate什么时候会将数据flush入数据库,在未flush之前不要将已经进行过save的对象从session中清除。

  解决办法就是在save后,执行session.flush();。

转载于:https://www.cnblogs.com/wangxb/p/5715169.html

Hibernate中evict方法和clear方法说明相关推荐

  1. Hibernate的evict方法和clear方法的区别

    摘自百度知道:http://zhidao.baidu.com/question/63663640.html 问: 先创建一个Student,然后调用session.save方法,然后再调用evict方 ...

  2. hibernate中get方法和load方法的根本区别

    hibernate中get方法和load方法的根本区别 如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来 ...

  3. Hibernate中get方法和load方法的区别

    一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...

  4. ThinkPHP 中M方法和D方法的具体区别

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  5. jquery中prop()方法和attr()方法

    接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别.原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. 大 ...

  6. python predict_对Keras中predict()方法和predict_classes()方法的区别说明

    1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...

  7. java——Scanner中nextLine()方法和next()方法的区别

    遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...

  8. ExtJS中listener方法和handler方法的区别

    listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...

  9. Keras中predict()方法和predict_classes()方法的区别

    正如上篇博客中所讲,在Keras框架下执行深度学习任务时,一般会先根据训练数据集训练出模型,然后拿训练好的模型到生产环境(测试集)中部署并生产.以分类问题为例,当训练好了分类模型之后,我们要用这个模型 ...

  10. VBA中Activate方法和Select方法的区别

    VBA中的Activate方法和Select方法看起来似乎相同,其实二者是有区别的.Activate方法的作用是激活,而Select方法的作用是选择.其区别如下: 1.对于"Sheets&q ...

最新文章

  1. Centos 内存占满 释放内存
  2. 基于fabric框架区块链实现科学数据出版系统
  3. 项目十大管理及5大过程组概览
  4. 突发!Python再次卫冕,Java和C下降,你怎么看?
  5. java校验入参的有效性的工具类
  6. 内存管理2-set方法的内存管理
  7. 深度解析dubbo源码 (dubbo整体设计) (二)
  8. 工频逆变器有哪些应用?工频逆变器、高频逆变器有何区别?
  9. 实战 | 一步步排查基于业务场景的Elasticsearch难题!
  10. [轉貼]奋斗5年从月薪3500到700万!
  11. Mac苹果键盘多个按键没响应该如何解决呢
  12. 随机梯度下降法(stochastic gradient descent,SGD)
  13. 数学中的术语与常用表达
  14. 微信ios接入-Objc -all_load的坑
  15. 【Bison学习笔记】1:生成简易的语法分析程序,使Bsion和Flex协同工作
  16. 解决摄像机被遮挡问题
  17. hdu 1824 Let's go home(2-sat 基础题)
  18. CUDA 深入浅出谈
  19. js怎么添加html空格,javascript-在JSX中添加空格的最佳做法
  20. 阳光智博改嫁给万物云:终止独立IPO计划,阳光城获利25亿元

热门文章

  1. 谈谈自己学习Linux的心得
  2. linux命令弹出移动硬盘,usb设备(移动硬盘或U盘),弹出时提示“有进程或程序占用,无法弹出”。解决办法...
  3. php钓鱼网站怎么做视频教程,反黑钓鱼网站全过程
  4. Mac各种问题的万能解决方法:重置SMC与重置NVRAM(PRAM)
  5. 【python】使用in判断元素是否在列表(list)中,如何提升搜索效率?
  6. idea设置主题风格
  7. 万圣节头像挂件微信小程序前端
  8. 什么是CMA?你对CMA证书了解多少?
  9. 金融反欺诈常用特征处理方法
  10. word添加脚注后正文跑到下一页