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

为什么Hibernate只在事务内部自动刷新?,hibernate,transactions,flush,Hibernate,Transactions,Flush,这种行为背后的理由是什么 如果出于某种原因,我在一个事务之外执行了两个合适的操作(我知道不推荐!),并且我已经将Hibernate配置为自动刷新,那么如果第二个操作是触发自动刷新的操作(如列表,迭代,或执行更新),我希望它会自动刷新 如果不是对autoflushifrequered方法的第二行进行显式检查,就会发生这种情况: protected boolean autoFlushIfRequired(Set querySpaces) throws HibernateException {

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

如果出于某种原因,我在一个事务之外执行了两个合适的操作(我知道不推荐!),并且我已经将Hibernate配置为自动刷新,那么如果第二个操作是触发自动刷新的操作(如
列表
迭代
,或
执行更新
),我希望它会自动刷新

如果不是对
autoflushifrequered
方法的第二行进行显式检查,就会发生这种情况:

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();
}
protected boolean autoFlushIfRequired(设置查询空间)引发HibernateeException{
errorIfClosed();
如果(!isTransactionInProgress()){
//在事务外部时不要自动刷新
返回false;
}
AutoFlushEvent事件=新的AutoFlushEvent(查询空间,this);
AutoFlushEventListener[]AutoFlushEventListener=listeners.getAutoFlushEventListeners();
for(int i=0;i

更新:感谢您找到导致此更改的Hibernate问题(在3.2中):


一个相关的问题仍然悬而未决:,但这两个讨论都没有提供说“当在事务外部操作时,FlushMode.AUTO是一件坏事”的理由。

因为
FlushMode
的文档说明

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


所以,汽车并不是你想象的那样。可以说,该名称选择不当,但这并不意味着每次会话操作后都会进行刷新。因此,它与JDBC的autocommit不同,后者在JDBC语句之后进行提交。

您希望它什么时候自动刷新?@axtavt-我已将我的问题更新为更具体一点。如果我执行一个通常自动刷新的操作,比如
列表
迭代
,或者
执行更新
,我希望它自动刷新。我不理解事务与上述代码的相关性。我已经看到并投票赞成了。Hibernate的人说“这是件坏事”: