这种行为背后的理由是什么?
如果由于某种原因我在事务之外执行了两个合适的操作(不推荐,我知道!)并且我已经将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是一件坏事。”
答案 0 :(得分:2)
因为FlushMode
的文件说明
有时会在查询执行之前刷新会话,以确保查询永远不会返回失效状态。这是默认的刷新模式。
所以,auto并不意味着你的意思。可以说,这个名称选择得很糟糕,但并不意味着在每次会话操作后都会进行刷新。因此,它与JDBC的自动提交不同,后者在JDBC语句之后进行提交。