`

Hibernate Session的Flush模式

阅读更多

Hibernate Session的Flush模式 


首先要知道的是:

 

Hibernate会尽量将与数据库的操作延迟,直到必须要与数据库进行交互,例如save方法一般会在提交时才真正执行,最终在提交时会以批处理的方式与数据库进行交互,以提高效率。

而将操作延迟,就是利用缓存,将最后要处理的操作放到缓存中。

 

flush方法的主要作用就是清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后提交事务。
     
      在下面的情况下,Hibernate会调用Session.flush()以清理缓存:
     1)事务提交时,如果flush模式不为FlushMode.NEVER,commit()将调用flush().
     2)在某些查询语句之前(此查询语句之前的语句已经改变了数据库状态,所以需要调用flush()以同步数据库是查出来的数据是经过更改的)。
    
     除非明确地指定了flush()命令,否则关于Session何时会执行这些JDBC调用完全是无法保证的,只能保证他们执行的前后顺序。


通过设置session.setFlushMode(),可以精确控制Hibernate的FlushMode.
(1) FlushMode.AUTO:Hibernate判断对象属性有没有改变,如果被更改成为脏数据,则在一个查询语句前将更新此改动以保证数据库的同步。这也是Hibernate的默认清理模式。
(2) FlushMode.COMMIT:在事务结束之前清理session的缓存。这样有可能导致查出脏数据
(3) FlushMode.NEVER:除非强制调用Session.flush(),否则永远不清理Session。相当于将数据库设置为一个只读的数据库。
       【如果此时进行数据的写入操作,会发生错误】
(4) FlushMode.ALWAYS:在每一个查询数据之前都调用Session.flush()。很显然这种效率很低。

在调用Session.flush()时,涉及的SQL语句会按照下面的顺序执行。
(1)         所有的实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序。
(2)         所有对实体进行更新的语句
(3)         所有对集合元素进行删除,更新或者插入的语句
(4)         所有对实体经行删除的语句,其顺序按照对象执行Session.delete()的时间顺序。
(5)         有一个例外是,如果对象使用native方式生成的ID(持久化标识),则他们一执行save就会被插入。
                 【因为native方式若想得到主键,必须与数据库交互,而hilo方式则不用】)

分享到:
评论

相关推荐

    hibernate的session.flush

    博文链接:https://llying.iteye.com/blog/221702

    hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别.docx

    session.flush()和session.clear()就针对session的一级缓存的处理。 简单的说, 1 session.flush()的作用就是将session的缓存中的数据与数据库同步。 2 session.clear()的作用就是清除session中的缓存数据(不管缓存...

    Hibernate的Session_flush与隔离级别代码详解

    主要介绍了Hibernate的Session_flush与隔离级别代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Hibernate的事务处理机制和flush方法的用法.docx

    关于在使用 hibernate 在提交事务时常遇到的异常: ...其实这个异常一般都是和我们在操作session flush方法和提交事务过程中会抛出的,下面就具体结合session的事务和声明周期来具体分析下,为什么会有这样的异常;

    hibernate学习笔记

    session flush测试(hibernate_session_flush) 12 hihernate一对多关联映射(单向Classes----->Student) 13 hihernate一对多关联映射(双向Classes<----->Student)(常用) 14 hibernate一对多双向自连接关联映射...

    hibernate操作数据库笔记

    Session对象.flush(); //将Session中的缓存内容提交到数据库 Session对象.clear(); //清空Session中的所有缓存(彻底清除会话) Session对象.beginTransaction().begin(); //开始一个事务 4.用Session对象的以下...

    hibernate基础教程

    3、批量存储:session.flush()和session.clear() 二 Hibernate中的二级缓存结构 在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,Session级别的缓存是由Hibernate...

    Hibernate使用技巧汇总

    session.Flush() 强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush 在session关闭时也会调用flush <br>4. Hibernate总是使用对象类型作为字段类型 5. XDoclet专门建立了...

    Hibernate学习笔记

    013 session_flush 014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联映射 双向 018 关联映射文件中标签中的 lazy(懒加载)属性 019 关联映射文件中集合标签中的 lazy(懒加载...

    Hibernate+中文文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    hibernate3.2中文文档(chm格式)

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    HibernateAPI中文版.chm

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    hibernate 教程

    同步(Flush) Session 9.7.2. 提交数据库事务 9.7.3. 关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API...

    hibernate.properties

    #hibernate.transaction.flush_before_completion ## Enable automatic session close at the end of transaction ## (This setting is relevant with or without the Transaction API) #hibernate.transaction....

    Hibernate中文详细学习文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    Hibernate 中文 html 帮助文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. ...

    Hibernate查询语言

    14.1. 批量插入(Batch inserts) 如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 ...session.flush(); session.clear(); } } tx.commit(); session.close(); 14.2. 批量更新(Batch updates)

    hibernate 体系结构与配置 参考文档(html)

    Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    Hibernate Session中的 flush方法的作用 get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org....

Global site tag (gtag.js) - Google Analytics