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();。

Hibernate中evict方法和clear方法说明的更多相关文章

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

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

  2. ThinkPHP 中M方法和D方法详解----转载

    转载的地址,http://blog.163.com/litianyichuanqi@126/blog/static/115979441201223043452383/ 自己学到这里的时候,不能清除的分 ...

  3. ThinkPHP 中M方法和D方法的具体区别(转)

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

  4. 线程中sleep方法和wait方法有什么区别?(转)

    本文转自https://www.cnblogs.com/linkstar/p/6043846.html 线程中sleep方法和wait方法有什么区别?   如果你没有接触过java的多线程,那么多对于 ...

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

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

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

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

  7. js进阶 12-13 jquery中one方法和trigger方法如何使用

    js进阶 12-13 jquery中one方法和trigger方法如何使用 一.总结 一句话总结: 1.one()方法和on()方法的区别是什么? 除了one()只执行一次,其它和on()一模一样,包 ...

  8. java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样

    一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...

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

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

随机推荐

  1. AT指令(转)

    资料来自网络 附录AT指令简编一. 一般命令1.AT+CGMI 给出模块厂商的标识.2.AT+CGMM 获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900) ...

  2. 笔记 进程(processes)

    进程:a program in execution(执行中的程序) 进程包括通过程序计数器(program counter)的值和处理器寄存器(processor's registers)的内容来表示 ...

  3. 【转载】ANSYS 动力分析 (9) - 瞬态动力分析 (1)

    原文地址:http://htbbzzg.blog.163.com/blog/static/69725206201081663611208/ 第四章   瞬态动力分析 第一节:瞬态动力分析的定义和目的  ...

  4. OC 相关

    1.OC runtime的理解[转载] http://www.csdn.net/article/2015-07-06/2825133-objective-c-runtime/1

  5. 如何用BarTender批量打印标签

    关于使用BarTender条码打印软件打印标签,很多小伙伴最关心的问题之一,莫过于如何实现BarTender批量打印标签.为了提高日常标签打印速度,为了方便快捷,也为了减少出错率,快来跟小编学习学习吧 ...

  6. Sql server 2008 R2 实现远程异地备份

    1. 环境: a)两台同样的Sql Server 2008 R2 服务器 b)操作系统都是windows 2008 c)需要将102.108.0.1数据库MSGC远程备份到112.118.0.2的服务 ...

  7. chp-adapter 文件结构

    1.需要接口给chp推送数据的Bean,写到/chp-adapter/src/main/java/com/creditharmony/adapter/service 文件夹中,并添加父类,供chp业务 ...

  8. Druid连接池初探

    Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. Maven配置 在pom.xml文件中添加如 ...

  9. IIS7.5打开GZip压缩,同时启用GZip压缩JS/CSS文件的设置方法[bubuko.com]

    IIS7.5或者IIS7.0开启GZip压缩方法:打开IIS,在右侧点击某个网站,在功能视图中的“IIS”区域,双击进入“压缩”,如图下图: 分别勾选“启用动态内容压缩”和“启用静态内容压缩”.这样最 ...

  10. 工程中建立多个src目录

    android 工程下可以有多个源代码的目录,不一定都要放到src下面.可以在 .classpath 文件中添加. 默认是这样的: <classpath> <classpathent ...