首页 > 编程知识 正文

hibernate的flush方法,hibernate flush

时间:2023-05-04 09:05:38 阅读:264467 作者:4572

session flush在commit之前默认都会执行他。也可以手动执行它,他主要做了两件事:
1) 清理缓存。
2) 执行SQL。
(这个过程实际上是指Session执行一些必须的SQL语句来把内存中的对象的状态同步到JDBC中。)
session在什么情况下执行flush
* 默认在事务提交时
* 显示的调用flush
* 在执行查询前,如:iterate
hibernate按照save(insert),update、delete顺序提交相关操作 


**********************************************************************

在下面的情况下,Hibernate会调用Session.flush()以清理缓存: 
1)事务提交时如果flush模式不为FlushMode.NEVER,commit()将调用flush(). 
2)在某些查询语句之前(此查询语句之前的语句已经改变了数据库状态,所以需要调用flush()以同步数据库是查出来的数据是经过更改的)。在调用Session.flush()时,涉及的SQL语句会按照下面的顺序执行。
(1所有的实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序。
(2)所有对实体进行更新的语句
(3)所有进行集合的删除语句
(4)所有对集合元素进行删除,更新或者插入的语句
(5)所有进行集合插入的语句
(6)所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序。(7)有一个例外是,如果对象使用native方式生成的ID(持久化标识),则他们一执行save就会被插入。除非明确地指定了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()。很显然这种效率很低。 
只用当使用触发器,或把Hibernate和JDBC混合使用,直接调用Session.flush()才是有意义的。

 

关于延迟加载

在前面介绍Session.load()方法时,已经介绍过关于延时加载的策略,但是当用Load()方法加载的对象长时间没有被调用时,就会被垃圾回收机制所回收。

在hibernate中可以通过一些采用延时加载策略封装的方法实现延时加载的功能,我们不仅也可以用load()方法进行延时加载,还可以在映射文件中的<property>元素中的lazy属性实现该功能。如下图所示

 注意:当使用get加载对象时,不一定就是立即查询,要根据你查询的内容和配置文件中的信息而定。(当然get加载语句中的对象.class一定是立即执行的,刚才所说的意思是,当通过外键查询其他表时,那么那些查询语句就不一定是立即执行)

例如:

lazy:默认是true(延迟加载),当设置成false时,就会立即执行查询的语句。还是那个问题(如果根据外键查询其他表时,Hql语句是如何执行的呢?):这要根据fetch属性而决定,当属性值是:select时(用谁查谁,会生成多条语句),join时(就会生成一条语句)

lazy还有一个属性值是proxy:(和select差不多,自动根据实际情况来,用谁查谁)

 

转载于:https://www.cnblogs.com/AnswerTheQuestion/p/6501384.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。