2008-10-15 36 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/框架,但即使在我看来,更多的工作也应该是必要的。