如何在基于Spring MVC的Web应用程序中创建撤消功能。

时间:2012-08-01 13:40:25

标签: java spring model-view-controller history undo

我有一名员工和一份相应的员工历史表。

两个表都具有相同的结构。历史记录表用于跟踪在一段时间内对员工所做的历史更改。

现在,我需要在对员工所做的更改中添加撤消功能。

e.g。员工职称于8月1日更改。现在,这将更新Employee表中的employees标题,并在employee_history表中插入相应的历史记录。

现在,我需要撤消此更改。员工编辑页面将包含对员工日期所做的更改列表,旁边有一个撤消按钮。

单击撤消应将Employee表中的更改还原为以前的值。另外我认为历史表中记录标题的记录也应该被删除。

此外,当我恢复对employee表的更改,即将标题恢复为以前的标题时,这将触发对历史表的​​插入,这是我不想要的。

我不确定最好的方法是什么。

任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:2)

如果你想实现一个“持久”撤销 - 一个在应用程序重启/会话超时后仍然存在的撤销,你应该考虑扩展你的数据库架构宽度timestamp字段并删除最后一个条目或用它替换它适当的早期条目。

“轻”版本将使用堆栈存储最后的交互,包括原始值和新值。当然,你可以在会话失效时保持堆栈以结合两种方法。这似乎就是你实际在做的事情。

您可以通过为每个更改创建和存储或导出SQL迁移脚本来扩展此解决方案,记录更改,如果可能,还可以执行相反的操作。因此,您甚至可以在应用程序实例和环境之间传输脚本,并且具有数据库状态的完全“可重放性”。

tl; dr - 看起来你已经实施了一个很好的解决方案

答案 1 :(得分:0)

我建议使用一个标志告诉触发器/历史逻辑在你运行undo并且不写历史数据时保持关闭。

通常情况下,这可以通过历史记录表中的序列化程序类提供并恢复员工数据,然后再次清理历史记录条目/解锁历史记录来完成。

答案 2 :(得分:0)

您可以使用交易的回滚功能。