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

Sam*_*Sam 5 java hibernate auditing hibernate-envers revision-history

我有一组域对象及其相关的表,用于应用程序的配置.经过身份验证的用户可以通过表示层更改这些域对象数据.这些 域对象具有非常重要的数据,我需要找到谁和何时更改了他们的数据.我的应用程序的数据访问层是使用JPA,Hibernate和Spring实现的.我需要记录每个更改,包括:用户+操作日期+操作类型+以前的值.

例如,让我们考虑一个简单的域对象(为了这个问题的目的简化):

@Entity
class Connection
{
   private Long id;
   private String name;
   private String protocol;
}
Run Code Online (Sandbox Code Playgroud)

假设有一个Connection具有以下值的实例:

Connection 
    id = 1;
    name = Web;
    protocol = HTTPS;
Run Code Online (Sandbox Code Playgroud)

在用户(例如John)登录UI并将此连接更改为以下值之后:

Connection
    id = 1;
    name = Web;
    protocol = HTTP;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,John将协议更改HTTPSHTTP(安全协议不安全!),因此我需要将Connection实例的历史记录保存在另一个表中以便进行审计.

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

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

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

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

Ste*_*veD 1

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

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

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

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