什么是Hibernate Session刷出(flush)?也许大家对此不够了解,但相信你看完本文一定有很大的收益。
成都创新互联坚实的技术研发基础赢得了行业内的良好口碑,公司成立10余年来,为上千家企业提供过网站建设、软件开发、搜索引擎优化技术、互联网大数据整合营销服务,多年的技术服务成功经验、众多的客户使我们能懂得更多,做得更好。"让您的网站跑起来"是我们一直追求的目标!
每间隔一段时间,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为打开或者断线状态的长时间运行的工作单元很有用。
- sess = sf.openSession();
- Transaction tx = sess.beginTransaction();
- sess.setFlushMode(FlushMode.COMMIT); // allow queries to return stale state
- Cat izi = (Cat) sess.load(Cat.class, id);
- izi.setName(iznizi);
- // might return stale data
- sess.find("from Cat as cat left outer join cat.kittens kitten");
- // change to izi is not flushed!
- ...
- tx.commit(); // flush occurs
- sess.close();
Hibernate Session刷出(flush)期间,可能会抛出异常。(例如一个DML操作违反了约束) 异常处理涉及到对Hibernate事务性行为的理解,这里在事务和并发中有具体的介绍,这里我们就不加以介绍了。
网站名称:Hibernate之Session刷出(flush)
本文网址:http://www.36103.cn/qtweb/news43/293.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联