2012-01-12 21 views
5

我們使用休眠與樂觀鎖定。 我們所有的實體都有@version註釋。關於hibernate的最佳更新策略stalestateException

這工作正常,如果用戶試圖保存一個陳舊的對象,我們得到一個stalestateexception。 在我們的例子中,我們想給用戶一個通知屏幕來放棄他的更改或覆蓋數據庫中的當前值。

這是過時狀態異常的常見用例。 我的問題與這個用例有關。如果用戶決定用他的更改覆蓋當前數據庫行,最好的策略是什麼?我已經通過了hibernate參考指南和不同的網站,但所有提到的事實是,您必須自己去捕捉stalestateexception,然後使用programmatical來處理數據的覆蓋。 我想知道如果hibernate有一些實用程序來簡化這個策略,那麼如果用戶決定用他的數據覆蓋,最簡單的事情就是從數據庫中檢索實體的最後一個版本,然後將所有更改的字段複製到該對象然後將更改的對象保存回數據庫。 但我不能停止想知道如果沒有更優雅的解決方案。

回答

1

我不認爲Hibernate會試圖幫助你,因爲這方面的要求可能非常複雜並且定製。

我猜測,如果用戶要保存一個已被另一個用戶同時更改的對象,那麼您很可能不想簡單地加載該對象並複製所有更改的字段並撤消所有其他用戶的更改。如果兩個用戶都改變了相同的字段會發生什麼您可能想向用戶展示這兩個版本,並要求他們決定哪個版本是正確的。有點像合併版本控制系統中的更改。

此外,您可能會有UI級別驗證,它會鏈接可能違反的字段,如果您只是在後端合併同一實體的兩個版本並保留它即可。

+0

在某些情況下,我們確實創建了一個「合併用戶界面」。 但有一些使用情況下數據不夠重要只是被覆蓋,我想知道是否有一些默認方法,或者如果你只需要自己編寫算法。 – 2012-01-20 14:09:41

+0

不是我意識到我害怕。 – 2012-01-20 16:17:21

+1

雖然這是一個很好的問題。我花了不少時間思考解決這種情況的最佳方法! – 2012-01-22 13:02:51

0

根據我的經驗,在這種情況下爲了介紹一些自動化,我曾經做過以下的技巧。我重新加載了實體並將其最後一個版本的值設置爲之前未能保存的陳舊對象。然後我做了merge()傳遞過時的對象。這樣,所有的字段都會被覆蓋,版本正在更新並且可以保存。當然,所有相關的參考文獻都必須以相同的方式處理。