java中的审计和数据历史记录

时间:2013-01-22 06:43:29

标签: java hibernate hibernate-envers auditing revision-history

我有一组域对象及其应用程序配置的相关表。经过身份验证的用户可以通过表示层更改这些域对象数据。这些域对象具有非常重要的数据,我需要找到谁和何时更改了他们的数据。我的应用程序的数据访问层是使用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个实例的历史记录保存到另一个可审计性表。

我为我研究了一个解决方案,并找到了以下结果:

  1. 触发器:一种可能性是在表上定义触发器,这种方式的缺点是依赖于数据库。
  2. Hibernate Envers:这个解决方案很好,但是我的 DAO 层依赖于Hibernate,我不会受益于JPA及其提供者的独立性。
  3. Spring Data Commons + hades:很好但是通过MappedSuperClass注释向任何实体添加了一些列:Create UserCreate Date,{{1} }和Last Update User。这意味着存储实体的完整历史和状态。
  4. 我自己的设计/实现: *我可以为这个目标实现一个层,但我不喜欢这个解决方案,因为我认为这个要求对我来说并不特别,我认为它已经解决了其他人遵循最佳实践(我不应该重新发明轮子)
  5. 有没有人对此问题有任何建议或解决方案?

    (对不起,如果我的问题很长,可能对专家来说太基础了)

4 个答案:

答案 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数据库