我已将几个Java类(如Customer,Assessment,Rating,...)映射到具有Hibernate的数据库。 现在我正在考虑对持久数据进行所有更改的历史模式。该应用程序是一个Web应用程序。在删除(或编辑)数据的情况下,另一个用户应该有可能看到更改并将其撤消。由于更改超出了当前会话的范围,我不知道如何解决此问题,例如命令模式,建议用于撤消功能。
对于单值编辑,此question中的方法听起来不错。但是删除整个持久性实体呢?最简单的方法是在删除此客户时在表中创建一个标志。最复杂的方法是为存储已删除实体的每个类创建一个表。介于两者之间吗?我怎样才能在O / RM系统(在我的情况下是Hibernate)中轻松地将这两个东西集成在一起,而不用担心SQL(我想避免因为可移植性)而且还有足够的灵活性?
有最好的做法吗?
答案 0 :(得分:4)
维护审计/撤消跟踪的一种方法是使用版本号标记对象记录的每个版本。如果这是一个简单的版本号,找到当前版本将是一个痛苦的努力,因此反向版本编号效果最好。 “版本0始终是当前的,如果您进行更新,则所有先前版本的版本号都会递增。删除对象是通过递增当前记录的版本号而不是在0处插入新版本来完成的。
与逐属性方法相比,这可以实现更简单的回滚或历史版本视图,但确实占用更多空间。
答案 1 :(得分:2)
这样做的一种方法是拥有一个“更改历史记录”实体,其中包含已更改实体的实体ID,操作(编辑/删除),属性名称,原始值,新值的属性。也许还可以参考执行编辑的用户。删除操作将为已删除实体的所有属性创建实体,并执行操作“删除”。
此实体将提供足够的数据来执行撤消和查看更改历史记录。
答案 2 :(得分:0)
嗯,我也在寻找答案。到目前为止,我发现的最好的是www.jboss.org/envers/框架,但即便如此,我觉得还有更多的工作要做。