2011-06-01 51 views
0

我需要一些關於Hibernate合併方法的說明。它是如何工作的。當我有一個分離的實體,並且我希望它被重新存儲時,Hibernate是否只查看當前會話中的同一個實體或所有Hibernate會話?Hibernate合併的一些更多解釋

有什麼辦法可以在實體上使用合併嗎?

回答

0

它只在當前的hibernate會話中查看,而不是所有的hibernate會話。

對於你的第二個問題,你不能通過'瞬態'(我相信你的意思,而不是'tansistent')的定義。瞬態意味着實體未被保存。合併意味着什麼都聽不見。

3

Hibernate的合併是在一次可能在當前內存中有多個對象實例的情況下使用的,並且您希望Hibernate保存對該對象的任何實例所做的任何和所有更改。例如,當您在驗證期間通過兩種不同方式加載對象時,可能會發生這種情況。

可能導致混淆的問題是應用程序會話和Hibernate會話之間的差異。在應用程序會話期間可以打開和關閉多個Hibernate會話。

如果您在第一次Hibernate會話中加載對象實例,然後關閉會話,那麼該實例將變爲分離狀態。如果你打開一個新會話,然後加載相同的對象(相同的ID),Hibernate將構造一個新的實例,如果你嘗試在第一個會話中獲得的對象上使用saveOrUpdate,Hibernate將拋出一個NonUniqueObjectException異常。

所以,雖然當前的Hibernate會話只關心自身,但其基礎結構的一部分是要知道大型應用程序會話中存在哪些映射Hibernate實體的對象,因此它應該考慮保存或合併等操作。

合併是一種告訴Hibernate的方法「我希望你能假設我對這個Hibernate實體所做的任何修改都應該保存,即使我把它們作爲對象的另一個實例,而不是一次我要求你保存「。 SaveOrUpdate是一種告訴Hibernate更保守的方法,而不是拋出異常。

還有一些關於Hibernate的saveOrUpdate和我的博客中合併in this article的區別的更多細節。