Hibernate之Session刷出(flush)
创始人
2024-06-08 00:51:31
0

什么是Hibernate Session刷出(flush)?也许大家对此不够了解,但相信你看完本文一定有很大的收益。

每间隔一段时间,Session会执行一些必需的SQL语句来把内存中的对象的状态同步到JDBC连接中。这个过程被称为Hibernate Session刷出(flush),默认会在下面的时间点执行:

◆在某些查询执行之前

◆在调用org.hibernate.Transaction.commit()的时候

◆在调用Session.flush()的时候

◆涉及的SQL语句会按照下面的顺序发出执行:

◆所有对实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序

◆所有对实体进行更新的语句

◆所有进行集合删除的语句

◆所有对集合元素进行删除,更新或者插入的语句

◆所有进行集合插入的语句

◆所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序

(有一个例外是,如果对象使用native方式来生成ID(持久化标识)的话,它们一执行save就会被插入。)

除非你明确地发出了flush()指令,关于Session何时会执行这些JDBC调用是完全无法保证的,只能保证它们执行的前后顺序。 当然,Hibernate保证,Query.list(..)绝对不会返回已经失效的数据,也不会返回错误数据。

也可以改变默认的设置,来让Hibernate Session刷出(flush)操作发生的不那么频繁。 FlushMode类定义了三种不同的方式。 仅在提交时刷出(仅当Hibernate的Transaction API被使用时有效), 按照刚才说的方式刷出, 以及除非明确使用flush()否则从不刷出。 最后一种模式对于那些需要长时间保持Session为打开或者断线状态的长时间运行的工作单元很有用。

  1. sess = sf.openSession();  
  2. Transaction tx = sess.beginTransaction();  
  3. sess.setFlushMode(FlushMode.COMMIT); // allow queries to return stale state  
  4.  
  5. Cat izi = (Cat) sess.load(Cat.class, id);  
  6. izi.setName(iznizi);  
  7.  
  8. // might return stale data  
  9. sess.find("from Cat as cat left outer join cat.kittens kitten");  
  10.  
  11. // change to izi is not flushed!  
  12. ...  
  13. tx.commit(); // flush occurs  
  14. sess.close(); 

Hibernate Session刷出(flush)期间,可能会抛出异常。(例如一个DML操作违反了约束) 异常处理涉及到对Hibernate事务性行为的理解,这里在事务和并发中有具体的介绍,这里我们就不加以介绍了。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...