這種行爲背後的基本原理是什麼?爲什麼Hibernate只在事務內部自動刷新?
如果由於某種原因,我在事務外執行兩個合適的操作(不推薦,我知道!),我配置了休眠以自動刷新,我會期望它自動刷新,如果第二個操作是一個應該觸發自動刷新(如list
,iterate
或executeUpdate
)。
這正是會發生什麼,如果不是明確檢查的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 2011-03-07 15:51:17
@axtavt - 我已經更新了我的問題,以更具體一點。我希望它能夠自動刷新,如果我執行一個通常自動刷新的操作,比如'list','iterate'或'executeUpdate'。我不明白交易與上述代碼的相關性。 – 2011-03-07 17:43:32
我見過並且投票。 Hibernate的人說,「這是一件壞事」:http://opensource.atlassian.com/projects/hibernate/browse/HHH-1410 – axtavt 2011-03-07 17:51:19