在Hibernate中,我想知道当flushMode为AUTO时哪些条件会触发刷新?它可能很复杂(或“魔术”),但基本条件是什么?
由于
答案 0 :(得分:10)
当flush mode为FlushMode.AUTO
时,它将在以下时间发生:
此模式的目的是避免“陈旧”状态。对内存中的对象所做的更改可能会与查询结果发生冲突。我的理解是Hibernate将进行“脏检查”,比较对象的原始状态和当前状态。如果它们不同并且Hibernate认为这种差异将使您暴露于陈旧数据,它将尝试将此状态推送到数据库。这是可能的,因为Hibernate知道查询将“触及”哪些表以及更新当前脏状态需要哪些表。
看看这个article:
尽管如此,自动冲洗在冲洗时非常智能 某些情况可能难以察觉。为了提高性能, Hibernate不会简单地总是刷新一切,但看看 查询所触及的数据库中的表和内存中的数据 应该存储在那些表中。如果没有重叠,则没有数据 将坚持下去。如果找到重叠,整个会话将是 冲洗,以确保一致性。
您还可以查看org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush
source code。
FlushMode.AUTO
有几个缺点:
由于这些缺点,我更喜欢FlushMode.COMMIT
,这可以让您获得更多控制权。在这种模式下,Hibernate会一直等到显式调用Commit或Flush,然后才会在内存状态与数据库同步。