2012-08-01 120 views
2

我有一個員工和一個相應的員工歷史表。如何在基於Spring MVC的Web應用程序中創建撤銷函數?

這兩個表具有相同的結構。歷史記錄表用於追蹤一段時間內員工的歷史變化。

現在,我需要爲對員工所做的更改添加撤消功能。

例如員工職位在8月1日更改。現在,這將更新Employee表中的員工職位並在employee_history表中插入相應的歷史記錄。

現在,我需要撤消這個改變。員工編輯頁面將包含一個員工日期更改列表,其旁邊有一個撤銷按鈕。

單擊撤銷應該將「員工」表中的更改恢復爲以前的值。我也認爲標題變化的歷史表中的記錄也應該刪除。

此外,當我恢復員工表的變化,即將標題恢復到以前的標題,這將觸發一個插入歷史表,我不想要。

我不確定什麼是最好的方法來做到這一點。

任何建議將有所幫助。

+5

我知道你正在尋找一些具體的,但可以考慮使用[命令模式](http://en.wikipedia.org/ wiki/Command_pattern) - 封裝更改的好處之一就是包含多級撤消。 – 2012-08-01 13:42:49

+2

它強烈依賴於UI框架 – kostja 2012-08-01 13:43:19

+0

@ kostja。它是一個基於Spring MVC的Web應用程序。 – ashishjmeshram 2012-08-01 13:44:02

回答

2

如果你想實現一個「永久」撤銷 - 一個可以在應用程序重新啓動/會話超時後存活的應用程序,你應該考慮擴展你的數據庫模式寬度timestamp字段,並刪除最後一個條目或用適當的早期條目。

「輕」版本將使用堆棧來存儲最後的交互,包括原始值和新值。當然可以堅持堆棧會話失效,以結合這兩種方法。這似乎是你實際上在做的。

您可以通過爲每個更改創建和存儲或導出SQL遷移腳本來擴展此解決方案,記錄更改並在可能的情況下記錄相反的操作。因此,您甚至可以在應用程序實例和環境之間傳輸腳本,並且具有完整的「重播」您的數據庫狀態。

TL;博士 - 它看起來像你已經實現了一個很好的解決方案

0

我會建議使用一個標誌,告訴觸發/歷史邏輯,以便在撤銷運行時不會寫入歷史數據。

正常情況下,這可以通過序列化程序級別從歷史記錄表中提取並恢復員工數據,然後再次清理歷史記錄/解鎖歷史記錄。

相關問題