2008-10-15 53 views
4

我使用Hibernate將幾個Java類映射到數據庫,如Customer,Assessment,Rating ...。 現在我正在考慮對持久數據進行所有更改的歷史模式。該應用程序是一個Web應用程序。在刪除(或編輯)數據的情況下,其他用戶應該有可能看到更改並撤消它。由於這些更改超出了當前會話的範圍,因此我不知道如何解決此類問題,如Command模式,建議用於撤消功能。實現O/RM系統(Hibernate)的長期歷史模式的最佳實踐?

對於單值編輯,像這樣的question的方法聽起來沒問題。但是刪除整個持久實體呢?最簡單的方法是在表格中創建一個標誌,如果這個客戶被刪除了。最複雜的方法是爲存儲已刪除實體的每個類創建一個表。之間有什麼?我怎樣才能將這兩件事整合到一個O/RM系統中(在我的情況下是Hibernate),而又不會因爲SQL(我想避免因爲可移植性)而煩惱,並且仍然有足夠的靈活性?

是否有一個最佳做法?

回答

2

這樣做的一種方法是創建一個「更改歷史記錄」實體,其中包含實體實體ID更改,操作(編輯/刪除),屬性名稱,原始值,新值的屬性。也許還可以參考執行編輯的用戶。刪除操作將爲刪除的實體的所有屬性創建實體,並執行「刪除」操作。

該實體將提供足夠的數據來執行undos和查看更改歷史記錄。

4

維護審計/撤銷跟蹤的一種方法是使用版本號標記對象記錄的每個版本。如果這是一個簡單的版本號,尋找當前版本將是一個痛苦的努力,所以反向版本編號效果最好。 「版本」0始終是當前版本,如果進行更新,則所有以前版本的版本號都會遞增。刪除對象是通過遞增當前記錄上的版本號,並且不在0處插入新版本號來完成。

相比於逐個屬性的方法,這可以實現更簡單的回滾或歷史版本視圖,但確實需要更多空間。

+0

你的方法聽起來很有趣,我有兩個問題:1)你在哪裏存儲這個版本號?在th e實體本身的表格或單獨的表格2)您如何避免與不明確的主鍵衝突,這些不同的實體應始終具有相同的鍵?謝謝 – maerch 2008-10-15 16:17:53

0

嗯我也在尋找這個答案。是www.jboss.org/envers/框架,但即使在我看來,更多的工作也應該是必要的。