当前位置: 首页 > 知识库问答 >
问题:

java中的审计和数据历史

滕弘新
2023-03-14

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

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

@Entity
class Connection
{
   private Long id;
   private String name;
   private String protocol;
}

假设存在具有以下值的连接实例:

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:是好的,但是通过MappdSuperClass注释向任何实体添加了一些列,如:创建用户创建日期最后更新用户最后更新日期。它意味着存储一个实体的完整历史和状态。
  4. 我自己的设计/实现:*我可以为这个目标实现一个层,但我不喜欢这个解决方案,因为我认为这个需求对我来说并不特别,我认为它已经被其他人按照最佳实践解决了(我不应该重新发明轮子)

有人对这个问题有什么建议或解决办法吗?

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

共有3个答案

周瀚
2023-03-14

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

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

哈沛
2023-03-14

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

听着,如果你想摆脱Hibernate,你可以切换到解决方案1/4。

凌鹏程
2023-03-14

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

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

从2012年1月1日到2012年12月31日,协议为HTTPS,从2013年1月1日到“永远”,协议为HTTP

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

 类似资料:
  • 我正在尝试使用Spring数据的审核功能(与Spring Boot和Spring数据Rest结合使用),但审核字段没有设置在save上。所有保存操作都会导致试图保存空“创建人”的约束异常 根据spring数据文档,我应该能够在实体上放置适当的审计注释(@CreatedDate/etc),并制作一个AuditorAware 我的问题是: 1)我是否有必要创建一个AuditingEntityListe

  • 我有一个带有spring Boot(v2.3.3)和spring数据的spring web应用程序。我的评估表包含以下列: Id 我的用例是表中名称和地址的任何更改评估应该创建一个新行,版本以相同的id递增。 因此,基本上只有当地址或姓名更新时,才能在评估表中插入新记录。下面是一个示例: 现有记录: 例如,名称已更新为Ryan,应该有两行,如下所示: 因此,基本上,任何名称和地址的变化都应在评估表

  • 由于我是审计新手,请让我了解以上问题。 谢谢你。

  • 问题内容: 我的问题是:是否有我可以使用的参考,也许是一本书或诸如决策树之类的东西,我可以参考这些参考来基于一些输入变量来决定应该走的路,例如: 数据库架构的成熟度 如何查询日志 需要重新创建记录的概率 更重要的是:写入或读取性能 所记录的值的性质(字符串,数字,blob) 可用的存储空间 我知道的方法是: 1.添加创建和修改日期及用户的列 表格示例: id value_1 value_2 val

  • 本文向大家介绍数据模型和数据库的历史,包括了数据模型和数据库的历史的使用技巧和注意事项,需要的朋友参考一下 数据模型的历史已有三代DBMS- 分层系统是第一代DBMS。第一代还带有CODASYL系统。他们两个都是在1960年代推出的。 第二代包括关系模型。EFCodd博士于1970年将其引入。 在第三代包括对象关系数据库管理系统和面向对象的数据库管理系统。 数据库的历史时间表如下所示- 基于文件的

  • 我的项目中有几个类是由Hibernate处理的,有些是由Envers审核的,有些则不是。现在,当我试图保存某个未经审计的实体时,我得到了以下信息: 有些人可能认为我的数据库中没有审计表,但是Envers甚至不应该试图寻找这个表,因为实体没有被审计。我的类看起来像这样: 因此,每个类都包含一个子类列表,其中包含对其父类的引用。这些类都没有用-注释标记,但它们引用了一些已审核的实体。然而,每个引用都用