Hibernate的evict方法和clear方法的区别
摘自百度知道: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方法的区别相关推荐
- Hibernate中get方法和load方法的区别
一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...
- hibernate中get方法和load方法的根本区别
hibernate中get方法和load方法的根本区别 如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来 ...
- 请简述一下线程的sleep()方法和yield()方法的区别?
请简述一下线程的sleep()方法和yield()方法的区别? ①sleep()方法给其他线程机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会. yield()方法只会给相同优先级或更高优 ...
- Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
原文作者:一叶丿清风 原文地址:schedule方法和scheduleAtFixedRate方法的区别 schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行 ...
- flush方法和close方法的区别
package com.learn.Demo05Writer;import java.io.FileWriter; import java.io.IOException;/*flush方法和close ...
- ExtJS中listener方法和handler方法的区别
listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...
- python predict_对Keras中predict()方法和predict_classes()方法的区别说明
1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...
- java——Scanner中nextLine()方法和next()方法的区别
遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...
- dispose方法和setvisible方法的区别和使用
dispose方法和setvisible方法的区别: dispose()撤销当前窗口,并释放当前窗口所使用的资源. setVisible()方法仅仅隐藏窗体,可设置窗口是否可见,窗口默认是不可见的. ...
最新文章
- matlab 取消figure显示时在屏幕最前
- Pandas基础用法合集(中文官档)
- Windows 2008 R2 SP1部署Lync2010标准版(1)
- windbg 脚本命令实例
- linux中 用户管理命令,Linux中的常用用户和用户组管理命令
- 转: ajax跨域之JSONP
- csv导入mysql linux_如何将CSV文件导入MySQL表
- UDP Socket编程 C/C++实现 (Windows Platform SDK)
- java学习(4):第一个java程序
- 告毕业生书——七剑送你下天山
- 【快讯】JeecgBoot低代码平台,成功入选2021科创中国·开源创新榜
- win10mysql卸载与重装_win10下完全卸载+重装MySQL步骤详解
- [Python]从哪里开始学习写代码(未完待续)
- win10系统中photoshop cs6中界面字体太小的解决方法
- HAUT OJ 1475: cxk下棋
- msvcr120d.dll 丢失
- SCI影响因子与期刊检索网站整理
- 解密阿里云IoT物联网平台MQTT Access Server核心架构
- Python每日一记127文本型数字转化为数值型数字(eval函数)
- [MAUI 项目实战] 音乐播放器(一):概述与架构
热门文章
- 6-7 BMI计算(类与对象) (10分)
- [ 利器篇 ] - 升级Ubuntu 18.04系统工具集合
- 微信公众号最佳实践 ( 9.1)会员卡
- 别再付费了!霸屏朋友圈的“蚂蚁呀嘿”视频教程大公开
- leetcode:13、罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
- 最短路径问题(Dijkstra常用用法总结)
- 使用IMP导入数据时遇到ORA-20005的错误
- 【无标题】C++输入两个坐标显示出输入的坐标以及均值
- 关于EBGP用回环口起邻居遇到的问题
- 每日一题----空瓶子喝可乐问题