我有一组域对象及其应用程序配置的相关表。经过身份验证的用户可以通过表示层更改这些域对象数据。这些域对象具有非常重要的数据,我需要找到谁和何时更改了他们的数据。我的应用程序的数据访问层是使用JPA,Hibernate和Spring实现的。我需要记录每个更改,包括:用户+操作日期+操作类型+以前的值。
例如,让我们考虑一个简单的域对象(为了这个问题而简化):
@Entity
class Connection
{
private Long id;
private String name;
private String protocol;
}
假设有Connection
个实例,其中包含以下值:
Connection
id = 1;
name = Web;
protocol = HTTPS;
在用户(例如John
)登录UI后,将此连接更改为以下值:
Connection
id = 1;
name = Web;
protocol = HTTP;
正如您所看到的,John将协议从HTTPS
更改为HTTP
(安全协议到不安全!),因此我需要将Connection
个实例的历史记录保存到另一个可审计性表。
我为我研究了一个解决方案,并找到了以下结果:
MappedSuperClass
注释向任何实体添加了一些列:Create User
,Create Date
,{{1} }和Last Update User
。这意味着存储实体的完整历史和状态。有没有人对此问题有任何建议或解决方案?
(对不起,如果我的问题很长,可能对专家来说太基础了)
答案 0 :(得分:1)
如果你已经使用过Hibernate:Hibernate Audit / Envers是最好的解决方案。
看,如果您想要摆脱Hibernate,那么您可以切换到解决方案#1 /#4。
答案 1 :(得分:0)
我使用过许多系统,我们在数据库表中添加了额外的列来跟踪用户ID和时间戳,以便进行审计。
如果您需要跟踪以前的值,可以使用日期范围来判断数据何时有效。例如:
2012年1月1日至2012年12月31日,协议为HTTPS 从2013年1月1日到'永远',协议是HTTP
有关时间模式的更多信息,请参阅Martin Fowler的blog。
答案 2 :(得分:0)
您可以轻松使用Hibernate Envers来实现灵活的审核。
my project on GitHub: jpauc-ear中有一个很小的启动示例。 并阅读official docs和使用示例。
答案 3 :(得分:0)
如果您不喜欢与具体ORM耦合,可以使用http://javers.org,因为它更通用,并且支持SQL和NoSql数据库