在FlushMode.AUTO背后检查什么?

时间:2011-08-28 16:11:17

标签: java hibernate flush

在Hibernate中,我想知道当flushMode为AUTO时哪些条件会触发刷新?它可能很复杂(或“魔术”),但基本条件是什么?

由于

1 个答案:

答案 0 :(得分:10)

flush modeFlushMode.AUTO时,它将在以下时间发生:

  • 执行查询之前
  • 提交Hibernate API上的事务时
  • 当应用程序显式调用session.flush()时

此模式的目的是避免“陈旧”状态。对内存中的对象所做的更改可能会与查询结果发生冲突。我的理解是Hibernate将进行“脏检查”,比较对象的原始状态和当前状态。如果它们不同并且Hibernate认为这种差异将使您暴露于陈旧数据,它将尝试将此状态推送到数据库。这是可能的,因为Hibernate知道查询将“触及”哪些表以及更新当前脏状态需要哪些表。

看看这个article

  

尽管如此,自动冲洗在冲洗时非常智能   某些情况可能难以察觉。为了提高性能,   Hibernate不会简单地总是刷新一切,但看看   查询所触及的数据库中的表和内存中的数据   应该存储在那些表中。如果没有重叠,则没有数据   将坚持下去。如果找到重叠,整个会话将是   冲洗,以确保一致性。

您还可以查看org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush source code

FlushMode.AUTO有几个缺点:

  • 你不能控制何时Hibernate决定执行UPDATE / INSERT / DELETE
  • 潜在的性能问题,因为每个对象修改都可能导致脏检查+ DML语句执行
  • 你没有利用Hibernate在不试图避免“陈旧”状态时可以执行的批处理和其他优化

由于这些缺点,我更喜欢FlushMode.COMMIT,这可以让您获得更多控制权。在这种模式下,Hibernate会一直等到显式调用Commit或Flush,然后才会在内存状态与数据库同步。