2010-04-18 47 views
1

我要去這個設計:休眠覆蓋數據庫修改與脫離對象狀態

創建一個對象,並保持它在所有的Web應用程序會話期間活着。

而且我需要將其狀態與數據庫狀態同步。

我想實現的是:

如果我的數據庫操作,那就是修改,我堅持到一個數據庫

有人故意敗壞錶行,然後在接下來的儲蓄到數據庫之間

所有這些更改都將與對象狀態一起被覆蓋,它總是包含有效數據。

什麼Hibernate方法,你推薦我用來堅持在數據庫中的修改?

saveOrUpdate()是一個可能的解決方案,但也許有更好的?

再次重申它的外觀。首先我創建一個沒有集合的對象。堅持下去(save())。

然後用戶爲我們提供了額外的數據。在serviceLayer中,我們再次修改內存中的對象(比如說,用集合填充它),然後再次保存它。

因此,下一步的每個serviceLayer操作都必須簡單地保證數據庫包含我們在內存中擁有的該對象的確切持久副本。如果數據庫中的數據不同,它必須與對象(保存在內存中)的狀態一起被超過。

你推薦什麼會話操作?

回答

2

FWIW saveOrUpdate()貌似整體的最佳選擇:

的saveOrUpdate()方法的方法是在實踐中比update()更加有用, save(),或lock():在複雜的對話,你不知道,如果該項目在 處於分離狀態,或者它是新的並且是瞬態的並且必須保存。當您的 不僅適用於單個實例,還希望重新掛接或保留已連接對象的網絡 並應用級聯選項時,saveOrUpdate()提供的自動 狀態檢測功能變得更加有用。

然而,對於你的情況,如果你是保證實體在遊離狀態修改,和/或不介意偶爾擊中不必要的更新DB,也許update()是最安全的選擇:

會話中的update()操作 將分離的對象重新連接到持久性上下文,並且計劃SQL UPDATE。休眠必須假定客戶端在分離時修改了 對象。 [...]當對話中的第二個事務提交時,將自動刷新持久性上下文 ,並且對曾經分離並且現在持久化的對象的任何修改都會與數據庫同步 。

來自Java Persistence with Hibernate的引述,章節11.2.2。