为什么Hibernate只在事务中自动刷新?

Jef*_*nal 5 hibernate transactions flush

这种行为背后的理由是什么?

如果由于某种原因我在事务之外执行两个合适的操作(不推荐,我知道!)并且我已经将Hibernate配置为自动刷新,如果第二个操作是应该触发自动的操作,我希望它会自动刷新-flush(如list,iterateexecuteUpdate).

如果没有对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是一件坏事".

JB *_*zet 3

因为文档FlushMode

有时会在查询执行之前刷新会话,以确保查询永远不会返回过时的状态。这是默认的冲洗模式。

所以,auto 并不意味着你所想的那样。可以说,这个名称选择得不好,但这并不意味着每次会话操作后都会进行刷新。因此,它与 JDBC 的自动提交不同,后者在 JDBC 语句之后进行提交。