【发布时间】:2011-07-10 10:55:07
【问题描述】:
这种行为背后的原因是什么?
如果出于某种原因我在事务之外执行了两个合适的操作(不推荐,我知道!)并且我已将 Hibernate 配置为自动刷新,我会期望它自动刷新如果第二个操作应该触发自动刷新(如list、iterate 或executeUpdate)。
如果不是对autoFlushIfRequried 方法的第二行进行显式检查,这正是会发生的情况:
protected boolean autoFlushIfRequired(Set querySpaces) throws HibernateException {
errorIfClosed();
if ( ! isTransactionInProgress() ) {
// do not auto-flush while outside a transaction
return false;
}
AutoFlushEvent event = new AutoFlushEvent(querySpaces, this);
AutoFlushEventListener[] autoFlushEventListener = listeners.getAutoFlushEventListeners();
for ( int i = 0; i < autoFlushEventListener.length; i++ ) {
autoFlushEventListener[i].onAutoFlush(event);
}
return event.isFlushRequired();
}
更新:感谢 axtavt 发现导致此更改的 Hibernate 问题(在 3.2 中):FlushMode.AUTO -> COMMIT when outside a transaction。
一个相关问题仍然悬而未决:delay IDENTITY insertions in the case of FlushMode.MANUAL/NEVER,但两个讨论都没有提供理由说“在事务之外操作时,FlushMode.AUTO 是一件坏事。”
【问题讨论】:
-
什么时候你希望它自动刷新?
-
@axtavt - 我已将我的问题更新为更具体一点。如果我执行通常会自动刷新的操作,例如
list、iterate或executeUpdate,我希望它会自动刷新。我不明白交易与上面代码的相关性。 -
我看过并点赞了。 Hibernate 家伙说“这是一件坏事”:opensource.atlassian.com/projects/hibernate/browse/HHH-1410
标签: hibernate transactions flush