4

我已经使用 Hibernate 将几个 java 类(如 Customer、Assessment、Rating 等)映射到数据库。现在我正在考虑对持久数据的所有更改的历史模式。该应用程序是一个 Web 应用程序。在删除(或编辑)数据的情况下,另一个用户应该有可能看到更改并撤消它。由于更改超出了当前会话的范围,因此我不知道如何以命令模式之类的方式解决此问题,建议将其用于撤消功能。

对于单值编辑,类似这个问题的方法听起来不错。但是删除整个持久实体呢?最简单的方法是在该客户是否被删除时在表中创建一个标志。最复杂的方法是为存储已删除实体的每个类创建一个表。中间有什么吗?我怎样才能将这两个东西舒适地集成到 O/RM 系统(在我的情况下是 Hibernate)中,而不用过多地使用 SQL(由于可移植性我想避免)并且仍然具有足够的灵活性?

有最佳实践吗?

4

3 回答 3

4

维护审计/撤消跟踪的一种方法是用版本号标记对象记录的每个版本。如果这是一个简单的版本号,则查找当前版本将是一项痛苦的工作,因此反向版本编号效果最好。“版本” 0 始终是当前版本,如果您进行更新,所有以前版本的版本号都会递增。删除对象是通过递增当前记录上的版本号而不是在 0 处插入新版本号来完成的。

与逐个属性的方法相比,这使得回滚或历史版本视图更加简单,但确实占用了更多空间。

于 2008-10-15T15:36:50.570 回答
2

一种方法是创建一个“更改历史记录”实体,其中包含更改实体的实体 ID、操作(编辑/删除)、属性名称、原始值、新值的属性。也许还参考执行编辑的用户。删除将使用“删除”操作为已删除实体的所有属性创建实体。

该实体将提供足够的数据来执行撤消和查看更改历史记录。

于 2008-10-15T15:15:35.200 回答
0

嗯,我也在寻找这个问题的答案。到目前为止,我发现的最好的是 www.jboss.org/envers/ 框架,但即便如此,在我看来,工作量也超过了必要的工作量。

于 2008-11-24T20:40:31.220 回答