2012-08-01 59 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

我会建议使用一个标志,告诉触发/历史逻辑,以便在撤销运行时不会写入历史数据。

正常情况下,这可以通过序列化程序级别从历史记录表中提取并恢复员工数据,然后再次清理历史记录/解锁历史记录。

相关问题