Jef*_*nal 5 hibernate transactions flush
这种行为背后的理由是什么?
如果由于某种原因我在事务之外执行两个合适的操作(不推荐,我知道!)并且我已经将Hibernate配置为自动刷新,如果第二个操作是应该触发自动的操作,我希望它会自动刷新-flush(如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();
}
Run Code Online (Sandbox Code Playgroud)
更新:感谢axtavt找到导致此更改的Hibernate问题(在3.2中):FlushMode.AUTO - >在事务外部时执行COMMIT.
一个相关的问题仍然存在:在FlushMode.MANUAL/NEVER的情况下延迟IDENTITY插入,但两个讨论都没有说明"当在事务外操作时,FlushMode.AUTO是一件坏事".
因为文档FlushMode说
有时会在查询执行之前刷新会话,以确保查询永远不会返回过时的状态。这是默认的冲洗模式。
所以,auto 并不意味着你所想的那样。可以说,这个名称选择得不好,但这并不意味着每次会话操作后都会进行刷新。因此,它与 JDBC 的自动提交不同,后者在 JDBC 语句之后进行提交。
| 归档时间: |
|
| 查看次数: |
4408 次 |
| 最近记录: |