在FlushMode.AUTO背后检查什么?

Loc*_*han 4 java hibernate flush

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

谢谢

Dmi*_*try 10

刷新模式FlushMode.AUTO它会发生在以下时间:

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

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

看看这篇文章:

尽管某些情况可能难以检测,但自动冲洗在何时冲洗时非常智能.为了提高性能,Hibernate不会简单地总是刷新所有内容,而是查看数据库中查询所涉及的表以及应该存储在这些表中的内存中的数据.如果没有重叠,则不会保留任何数据.如果找到重叠,则将刷新整个会话,以确保一致性.

您还可以查看org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush 源代码.

有几个缺点FlushMode.AUTO:

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

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