5

我有一组域对象及其用于应用程序配置的相关表。经过身份验证的用户可以通过表示层更改这些域对象数据。这些 域对象具有非常重要的数据,我需要找出谁以及何时更改了他们的数据。我的应用程序的数据访问层是使用 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 将协议从更改HTTPSHTTP(安全协议更改为不安全!),因此我需要将Connection实例的历史记录保存在另一个表中以进行审计。

我已经为我研究了一个解决方案,并发现了以下结果:

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

有没有人对这个问题有任何建议或解决方案?

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

4

4 回答 4

1

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

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

于 2013-01-22T12:03:02.373 回答
1

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

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

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

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

于 2013-01-22T11:44:16.763 回答
0

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

于 2015-04-02T09:14:22.113 回答
0

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

我在 GitHub 上的项目中有一个小型启动示例:jpauc-ear。并阅读带有使用示例的官方文档。

于 2013-02-04T00:56:27.610 回答