2011-03-07 19 views
5

這種行爲背後的基本原理是什麼?爲什麼Hibernate只在事務內部自動刷新?

如果由於某種原因,我在事務外執行兩個合適的操作(不推薦,我知道!),我配置了休眠以自動刷新,我會期望它自動刷新,如果第二個操作是一個應該觸發自動刷新(如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(); 
} 

更新:謝謝axtavt尋找Hibernate的問題,促使本改變(在3.2中):FlushMode.AUTO -> COMMIT when outside a transaction

一個相關的問題仍然存在:delay IDENTITY insertions in the case of FlushMode.MANUAL/NEVER,但這兩個討論都沒有提供說「在事務外操作時,FlushMode.AUTO是壞事情」的理由。

+1

_你希望它自動刷新嗎? – axtavt 2011-03-07 15:51:17

+0

@axtavt - 我已經更新了我的問題,以更具體一點。我希望它能夠自動刷新,如果我執行一個通常自動刷新的操作,比如'list','iterate'或'executeUpdate'。我不明白交易與上述代碼的相關性。 – 2011-03-07 17:43:32

+0

我見過並且投票。 Hibernate的人說,「這是一件壞事」:http://opensource.atlassian.com/projects/hibernate/browse/HHH-1410 – axtavt 2011-03-07 17:51:19

回答

2

因爲對於FlushMode的docummentation說

會話有時查詢執行前,爲了沖洗,以確保查詢不會返回已經失效狀態。這是默認的沖洗模式。

所以,汽車並不意味着你的想法。這個名字可以說是很糟糕的選擇,但並不意味着在每次會話操作之後都會發生沖洗。因此它與JDBC的自動提交不類似,它在JDBC語句後進行提交。