【问题标题】:Why does Hibernate only Auto-Flush inside a transaction?为什么 Hibernate 只在事务中自动刷新?
【发布时间】:2011-07-10 10:55:07
【问题描述】:

这种行为背后的原因是什么?

如果出于某种原因我在事务之外执行了两个合适的操作(不推荐,我知道!)并且我已将 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 是一件坏事。”

【问题讨论】:

  • 什么时候你希望它自动刷新?
  • @axtavt - 我已将我的问题更新为更具体一点。如果我执行通常会自动刷新的操作,例如listiterateexecuteUpdate,我希望它会自动刷新。我不明白交易与上面代码的相关性。
  • 我看过并点赞了。 Hibernate 家伙说“这是一件坏事”:opensource.atlassian.com/projects/hibernate/browse/HHH-1410

标签: hibernate transactions flush


【解决方案1】:

因为FlushMode 的文档说

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

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

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2020-09-18
    相关资源
    最近更新 更多