Hibernate session.flush() 使用

六开彩预测内部

Hibernate session.flush() 使用

session flush在commit之前默认都会执行, 也可以手动执行,他主要做了两件事:

1) 清理缓存。

2) 执行SQL。

六开彩预测内部flush: Session 按照缓存中对象属性变化来同步更新数据库。

默认情况下,Session 会在以下情况下调用 flush:

1. 直接调用 session.flush。

2。 当应用调用Transaction。commit() 时, 会先调用 flush, 然后再向数据路提交。

3. 在做查询时(HQL, Criteria),如果缓存中持久化对象的属性发生变化,会先 flush 缓存,以保证查询结果是最新的数据。

六开彩预测内部flush 缓存的例外情况:如果对象使用native 生成器生成 ID 时,在当调用session.save() 去保存对象时, 会直接向数据库插入该实体的 insert 语句。

flush 的五种 FlushModel :

1、NEVEL:已经废弃了,被MANUAL取代了

2 MANUAL:

如果FlushMode是MANUAL或NEVEL,在操作过程中Hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误

org。springframework。dao。InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode。NEVER) - turn your Session into FlushMode。AUTO or remove "readOnly" marker from transaction definition;

解决办法:配置事务, Spring会读取事务中的各种配置来覆盖hibernate的session中的FlushMode;

3 AUTO

设置成auto之后,当程序进行查询、提交事务或者调用session.flush()的时候,都会使缓存和数据库进行同步,也就是刷新数据库

4 COMMIT

提交事务或者session。flush()时,刷新数据库;查询不刷新

5 ALWAYS:

每次进行查询、提交事务、session.flush()的时候都会刷数据库

ALWAYS和AUTO的区别:当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当 session设置为FlushMode。AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷,而always是直接刷新,不进行任何判断。很显然auto比always要高效得多。

如果session 中的某个类的属性发生了改变,使用flush() 方式,去更改数据库中的记录,使其和改变后的session 中的对象一致

session.commit 和 session.flush 区别:

session。flush: 执行 一列 sql,但是不提交

session.commit: 会先执行 flush,然后提交事务,提交事务意味着对数据库的操作永久保存,不可rollback。

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。

我要收藏
赞一个
踩一下
分享到

分享
评论
六开彩预测内部
六合平台网站 中特期期免费公开 天线宝宝一肖平特图 香港六个彩开奖记录 手机报码最新开奖 中特期期免费公开 天线宝宝一肖平特图 手机看马会开奖 看图解平特一肖 中特期期免费公开