【问题标题】:Audit and data history in javajava中的审计和数据历史
【发布时间】:2013-01-05 08:30:36
【问题描述】:

我有一组域对象及其相关的应用程序配置表。经过身份验证的用户可以通过表示层更改这些域对象数据。这些域对象有非常重要的数据,我需要找出谁以及何时更改了他们的数据。我的应用程序的 数据访问 层是使用 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 User、Create Date、Last Update User 和 Last Update Date。这意味着存储实体的完整历史记录和状态。
  4. 我自己的设计/实现:* 我可以为这个目标实现一个层,但我不喜欢这个解决方案,因为我认为这个要求对我来说并不特别,而且我认为它已经被其他人解决了遵循最佳做法(我不应该重新发明轮子)

有人对此问题有任何建议或解决方案吗?

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

【问题讨论】:

  • 是的,这也是我的挑战。
  • 你最后做了什么?

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


【解决方案1】:

我曾使用过许多系统,在这些系统中,我们向数据库表中添加了额外的列,以跟踪用户 ID 和时间戳以进行审计。

如果您需要跟踪以前的值,可以使用日期范围来判断数据何时有效。例如:

从 01.01.2012 到 31.12.2012,协议是 HTTPS 从 01.01.2013 到“永远”,协议是 HTTP

有关时间模式的更多信息,请参阅 Martin Fowler 的blog。

【讨论】:

    【解决方案2】:

    如果您已经在使用 Hibernate:Hibernate Audit/Envers 是最好的解决方案。

    看,如果你想摆脱 Hibernate,那么你可以切换到解决方案 #1/#4。

    【讨论】:

    • 谢谢。我已经使用Hibernate Envers 并认为这是最好的解决方案,只是我害怕何时决定将JPA 提供者从Hibernate 更改为另一个,例如OpenJPA 或Toplink,那天我没有审计/历史实体:(
    【解决方案3】:

    您可以轻松使用 Hibernate Envers 来实现灵活的审计。

    my project on GitHub: jpauc-ear 中有一个小型启动示例。 并阅读 official docs 的用法示例。

    【讨论】:

    • 谢谢,我有使用 Hibernate Envers 的经验,但它会将我的应用程序绑定到 Hibernate ORM 并且我没有 JPA 提供者独立利益。
    • @MJM JPA 的目的是提供不依赖于 DBMS 的抽象层,因此 #1 触发器也不适合。我会使用#3 方式。
    • 是的,你说得对。我的手段也是:通过Hibernate Envers 我依赖于Hibernate 实现JPA api,这并不好。
    【解决方案4】:

    如果您不喜欢与具体的 ORM 耦合,可以使用 http://javers.org,因为它更通用,并且支持 SQL 和 NoSql 数据库

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2016-02-18
      • 2017-06-29
      • 2014-01-25
      • 2011-05-22
      相关资源
      最近更新 更多