2
當hibernate關閉會話時,關閉的目的基本上是關閉底層連接並清理第一級緩存。爲什麼沖洗也不會在這裏自動發生?爲什麼hibernate session.close()不會自動刷新數據?
當hibernate關閉會話時,關閉的目的基本上是關閉底層連接並清理第一級緩存。爲什麼沖洗也不會在這裏自動發生?爲什麼hibernate session.close()不會自動刷新數據?
從transactional角度來看,flushing是從關閉會話和flush
一個事務的邊界內應發生(或在commit
時間)非常不同:
結束會話通常涉及四個 不同階段:
- 沖洗會議
- 提交事務
- 關閉會話
- 處理異常
在另一方面,關閉會話(與基礎連接)應在交易結束後進行(未決交易的行爲,關閉連接時是undefined)。
因此沒有理由關閉任何東西並促進不良語義,並且具有不同的操作是非常有意義的。
綜上所述:
SessionFactory#getCurrentSession()
並且您不必自己Session#close()
(Session
將在提交時關閉)。
@Pascal,我想你並沒有真正回答op的問題。他沒有建議刷新和關閉會話是相同的,但是如果會話很髒,那麼在關閉它時也應該調用flush。如果有人使用FlushMode.Auto並且他們更新了一個持久對象,那麼我認爲Hibernate應該在它認爲已經完成的時候沖洗該對象,Hibernate不應該忽略這個變化。如果不調用flush,我認爲可能會發生這種情況。 – Ittai 2010-10-14 07:44:44
@Ittai我已經澄清了我的答案(不夠清楚),我試圖解釋爲什麼我不同意你的看法。 – 2010-10-14 08:26:46
@帕斯卡,謝謝你的澄清,但我仍然不同意。關於Item2,在我的案例中,這與我使用session-per-request模式無關,有時我需要會話在提交後保持打開狀態。關於Item1,這正是我不喜歡的 - 爲什麼要使用交易進行單個更新?我將交易視爲一種確保幾個不同命令一致的方式(將他們分組爲一個工作單元)。但是當只有一個命令時,我們爲什麼要使用一個事務? (順便說一句,我以前總是使用JDBC,這可能會影響我的特徵)。 – Ittai 2010-10-14 08:36:02