zoukankan      html  css  js  c++  java
  • Hibernate中evict方法和clear方法说明

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


     

    逝者如斯夫,不舍昼夜,为爱的人去努力,为爱的事去奋斗。
  • 相关阅读:
    “让开发者爱上安全测试”系列之“源码安全测试”——开发者之伤
    敏捷开发中高质量 Java 代码开发实践
    软件测试转型之路--革新全程软件测试
    衡量DevOps成功的15个标准
    C# winFrom窗体设计问题-部分文件打不开窗体设计器 变成类.cs
    Asp.net IIS Express 无法启动 解决办法
    C# winForm资源文件实现多语言切换
    C#用DataTable实现Group by数据统计
    C# 控件拖动
    Android studio Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to
  • 原文地址:https://www.cnblogs.com/wangxb/p/5715169.html
Copyright © 2011-2022 走看看