这里面的清理缓存可以理解为hibernate自动执行了一次 session.flush();
选择什么样的flush mode就是采取对hibernate session采取什么样的数据刷新的策略。
Session.setFlushMode()用于设定清理缓存的时间点。
对比一下几种flush mode:
FlushMode.AUTO:
调用Session的查询方法时,清理缓存,注意:这条规则必须保证显式开启的事务中,对于outside a transaction
调用Session.commit()时,清理缓存
调用Session.flush()时,清理缓存
FlushMode.COMMIT:
调用Session的查询方法时,不清理缓存
调用Session.commit()时,清理缓存
调用Session.flush()时,清理缓存
FlushMode.NEVER(MANUAL):
调用Session的查询方法时,不清理缓存
调用Session.commit()时,不清理缓存
调用Session.flush()时,清理缓存
FlushMode.ALWAYS:测试未发现和auto有什么区别。
调用Session的查询方法时,清理缓存,注意:这条规则必须保证显式开启的事务中,对于outside a transaction
调用Session.commit()时,清理缓存
调用Session.flush()时,清理缓存
=================
三种情况分别在以下时机同步数据库
session.flushmode=manual
1.只有手动调用flush()
session.flushmode=commit
1.手动调用flush()
2.commit()时候
session.flushmode=auto
1.手动调用flush()
2.commit()时候
3.查询前 (经过测试(oracle驱动),必须在事务内,不确定是否全部情形)
==================
对比一下,请注意FlushMode.NEVER
如果在调用Session的查询方法之前,不清理缓存,那么就会引入脏数据
所以会有那一步
session.flush(); // who know‘s what been done till now
在FlushMode.NEVER之前,将缓存清理,保证数据正确。
在文中最后一段程序中:
将FlushMode.NEVER夹在两个session.flush()之间,就保证在不清理缓存的情况,数据的一致性。
下面的文章值得一看。
《了解Hibernate的FlushMode.NEVER模式》
http://www.51cto.com/specbook/229/34023.htm