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

时间:2011-03-07 15:49:59

标签: hibernate transactions flush

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

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

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

1 个答案:

答案 0 :(得分:2)

因为FlushMode的文件说明

  

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

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