2009-12-28 43 views

回答

7

transactional角度來看,flushing是從關閉會話和flush一個事務的邊界內應發生(或在commit時間)非常不同:

結束會話通常涉及四個 不同階段:

  • 沖洗會議
  • 提交事務
  • 關閉會話
  • 處理異常

在另一方面,關閉會話(與基礎連接)應在交易結束後進行(未決交易的行爲,關閉連接時是undefined)。

因此沒有理由關閉任何東西並促進不良語義,並且具有不同的操作是非常有意義的。

綜上所述:

  1. 只是使用事務和適當的劃分爲你應該(和會議將在必要時提交時就臉紅,這取決於FlushMode)。
  2. 使用SessionFactory#getCurrentSession()並且您不必自己Session#close()Session將在提交時關閉)。
+0

@Pascal,我想你並沒有真正回答op的問題。他沒有建議刷新和關閉會話是相同的,但是如果會話很髒,那麼在關閉它時也應該調用flush。如果有人使用FlushMode.Auto並且他們更新了一個持久對象,那麼我認爲Hibernate應該在它認爲已經完成的時候沖洗該對象,Hibernate不應該忽略這個變化。如果不調用flush,我認爲可能會發生這種情況。 – Ittai 2010-10-14 07:44:44

+1

@Ittai我已經澄清了我的答案(不夠清楚),我試圖解釋爲什麼我不同意你的看法。 – 2010-10-14 08:26:46

+0

@帕斯卡,謝謝你的澄清,但我仍然不同意。關於Item2,在我的案例中,這與我使用session-per-request模式無關,有時我需要會話在提交後保持打開狀態。關於Item1,這正是我不喜歡的 - 爲什麼要使用交易進行單個更新?我將交易視爲一種確保幾個不同命令一致的方式(將他們分組爲一個工作單元)。但是當只有一個命令時,我們爲什麼要使用一個事務? (順便說一句,我以前總是使用JDBC,這可能會影響我的特徵)。 – Ittai 2010-10-14 08:36:02

相關問題