摘自百度知道:http://zhidao.baidu.com/question/63663640.html

问:
先创建一个Student,然后调用session.save方法,然后再调用evict方法把Student对象清除出缓存,再提交事务,
可是会报错:Exception in thread "main" org.hibernate.AssertionFailure: possible nonthreadsafe access to session
但是如果我用的不是evict方法,而是clear方法用来清除缓存的话,程序没有错。 答:
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。

Hibernate的evict方法和clear方法的区别相关推荐

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

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

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

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

  3. 请简述一下线程的sleep()方法和yield()方法的区别?

    请简述一下线程的sleep()方法和yield()方法的区别? ①sleep()方法给其他线程机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会. yield()方法只会给相同优先级或更高优 ...

  4. Java并发编程—schedule方法和scheduleAtFixedRate方法的区别

    原文作者:一叶丿清风 原文地址:schedule方法和scheduleAtFixedRate方法的区别 schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行 ...

  5. flush方法和close方法的区别

    package com.learn.Demo05Writer;import java.io.FileWriter; import java.io.IOException;/*flush方法和close ...

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

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

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

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

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

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

  9. dispose方法和setvisible方法的区别和使用

    dispose方法和setvisible方法的区别: dispose()撤销当前窗口,并释放当前窗口所使用的资源. setVisible()方法仅仅隐藏窗体,可设置窗口是否可见,窗口默认是不可见的. ...

最新文章

  1. matlab 取消figure显示时在屏幕最前
  2. Pandas基础用法合集(中文官档)
  3. Windows 2008 R2 SP1部署Lync2010标准版(1)
  4. windbg 脚本命令实例
  5. linux中 用户管理命令,Linux中的常用用户和用户组管理命令
  6. 转: ajax跨域之JSONP
  7. csv导入mysql linux_如何将CSV文件导入MySQL表
  8. UDP Socket编程 C/C++实现 (Windows Platform SDK)
  9. java学习(4):第一个java程序
  10. 告毕业生书——七剑送你下天山
  11. 【快讯】JeecgBoot低代码平台,成功入选2021科创中国·开源创新榜
  12. win10mysql卸载与重装_win10下完全卸载+重装MySQL步骤详解
  13. [Python]从哪里开始学习写代码(未完待续)
  14. win10系统中photoshop cs6中界面字体太小的解决方法
  15. HAUT OJ 1475: cxk下棋
  16. msvcr120d.dll 丢失
  17. SCI影响因子与期刊检索网站整理
  18. 解密阿里云IoT物联网平台MQTT Access Server核心架构
  19. Python每日一记127文本型数字转化为数值型数字(eval函数)
  20. [MAUI 项目实战] 音乐播放器(一):概述与架构

热门文章

  1. 6-7 BMI计算(类与对象) (10分)
  2. [ 利器篇 ] - 升级Ubuntu 18.04系统工具集合
  3. 微信公众号最佳实践 ( 9.1)会员卡
  4. 别再付费了!霸屏朋友圈的“蚂蚁呀嘿”视频教程大公开
  5. leetcode:13、罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
  6. 最短路径问题(Dijkstra常用用法总结)
  7. 使用IMP导入数据时遇到ORA-20005的错误
  8. 【无标题】C++输入两个坐标显示出输入的坐标以及均值
  9. 关于EBGP用回环口起邻居遇到的问题
  10. 每日一题----空瓶子喝可乐问题