2013-06-29 82 views
0

我一直googling很多關於flush(),提交()和我已經讀過休眠聖經(Java持久與休眠)。休眠沖洗沒有提交,使用手動flushmode

在我理解這些方法如何工作的過程中,似乎仍然存在一些不一致。

這是一個有點令人費解的觀察:

讓我們假設,我們使用手動flushmode。 我們開始一個新的會話,啓動一個事務,加載並修改一些持久化對象,然後刷新並關閉會話,但是在這個過程中我們沒有對事務執行commit方法。

據我所知(從休眠聖經),在這種情況下,修改是而不是保存到數據庫,即使flush()被調用。這是一個正確的觀察?

這裏是一個其它相關問題,hibernate javadoc說:

法拉盛同步與保存在內存中持久化狀態的底層持久性存儲的過程。

這是什麼意思?術語「同步」在這裏有點模糊,這個描述並沒有解釋(還有什麼矛盾!)上面提到的觀察。

請問有人可以精確地澄清詞同步的意義在這裏,因爲我無法在網上或hibernate聖經找到這個問題的答案。

回答

3

下面應該有所幫助:

據我所知(從休眠聖經),在這種情況下,修改不會保存到即使沖洗()被調用數據庫。這是一個正確的觀察? :是的,它是正確的。

刷新是將基礎持久存儲與持久存儲器中的持久狀態同步的過程。

這意味着實體的狀態與數據庫的狀態同步。

可能有人請準確澄清字同步的意義在這裏,因爲我無法找到這個問題的答案既不是在網上還是在休眠聖經:

考慮您改變對象的狀態(通過改變該對象的任何屬性),而該對象與會話相關聯。現在狀態對象的對象與數據庫(數據庫表中的行)不同。在這裏,當你調用flush的時候,一個更新查詢由hibernate生成,用這個狀態更新數據庫。

但是更新操作已提交?否,您需要發出提交以確保此更新實際上反映在數據庫中。

因此,讓您感到困惑的同步部分只不過是確保數據庫和實體同步。

實際上,當你調用commit()時,默認情況下會隱式調用flush()。

0

是的,當我們在會話中調用flush()方法時,對象的變化與 與DB相關的實體同步,但它不會更新到數據庫。當我們調用Commit()時,它會被更新。