【问题标题】:How to limit the types of audits in Hibernate Envers如何限制 Hibernate Envers 中的审计类型
【发布时间】:2017-03-04 04:12:27
【问题描述】:

我正在尝试我的第一个 Hibernate Envers 实现。我已经准备好所有的@Audited 标签,并且正在生成 DDL 来创建审计表。

根据我的阅读,每次审核表获得新记录、记录更改或删除记录时,审核表都会获得一条记录。

对于我的实施,我只真正关心更改,因为我已经读到审计会对性能造成影响,所以我想关闭我不需要的。

我很难找到这方面的信息。唯一接近的事情是我需要关闭所有 Envers 侦听器并自己重新实现它们,让我不想要的那些不做任何事情。

这似乎需要做很多工作,而我已经处于未知领域。有谁知道一个简单的方法来做到这一点?如果做不到这一点,有没有人可以分享一些代码来展示如何做到这一点?

谢谢,

【问题讨论】:

  • 我理解您的性能问题,但考虑到您的实施;您是否已分析并确定您的关注是否有任何价值? Envers 被许多大型私人组织使用,管理数百万行而几乎没有开销。也许您可以更具体地详细说明您关注的用例,我很乐意提供答案。

标签: java hibernate audit hibernate-envers


【解决方案1】:

这里的简短回答是不,没有。

唯一可用的切换选项是告诉 Envers 是否应该审核 DEL 修订类型行中的所有列数据。默认行为是在删除实体时不包括所有列值;但是在某些情况下,存储此信息可能非常有用。

此外,这不仅仅是阻止特定 Envers 侦听器注册的简单案例,也不是重新编码特定侦听器那么简单。

让我们看看一些用例

// Fetch the parent
Parent parent = entityManager.find( Parent.class, parentId );

// Add a new child entity to parent
entityManager.getTransaction().begin();
Child child = new Child( "Naros" );
child.setParent( parent );
parent.getChildren().add( child );
entityManager.persist( child );
entityManager.merge( parent );    
entityManager.getTransaction().commit();

// Update a child entity 
entityManager.getTransaction().begin();
child.setName( "Naros2" );
entityManager.merge( child );
entityManager.getTransaction().commit();

// Remove child entities from parent
entityManager.getTransaction().begin();
parent.getChildren().forEach( c -> c.setParent( null ) );
parent.getChildren().clear();
entityManager.merge( parent );
entityManager.getTransaction().commit();

在上述所有3 案例中,Parent 实体将使用 MOD 修订条目进行审计,该条目描述它在特定时间使用给定修订号进行了修改。

类似地,第一个场景将包含一个 ADD 修订条目,用于将 Child 添加到父集合中。这将包括与Parent 的第一个修订版相同的修订版号。

第二个场景将包含一个 MOD 修改条目,用于修改 Child。根据父类中集合的类型,您所做的更改是否影响集合的顺序,MOD 也可能会为 Parent 实体触发。

最后一个场景将包含 Child 从集合中删除时的 DEL 修改条目和 MOD 因为父状态已修改。

可以禁止这种行为,可以。但这样做的问题是你失去了一些真正有价值的功能。

例如,Parent 将仅包含您实际修改 Parent 的属性时的审核行,而不是您修改与其关联的任何集合属性时的审核行。这意味着在一个简单的示例中,Parent 将只有 1 个审计行,即插入时的 ADD

但是,如果您需要在更改 children 集合后的每个修改步骤中知道 Parent 的实际状态怎么办?好吧,你不能。

您没有详细说明为什么性能在这里确实会成为问题,因此我不一定要详细说明这一点。

但是,如果您这样做,从审计的角度来看,尝试关闭 Envers 的各个方面可能并且很可能会产生负面影响。

【讨论】:

  • 感谢您的信息。如果应用程序一直在复制类并保持它们,我已经阅读了对我有意义的性能问题。但是,如果您说它没有那么受欢迎,我可以接受。
  • 我正在从另一个系统迁移,该系统也进行了审核,但仅针对更改。我计划手动将更改迁移到审计表中。这是可取的吗?您是只创建更改记录还是应该创建最旧的修订作为添加记录?
  • 如果您对审计表架构以及修订号如何工作等有清晰的了解,那么您当然可以将旧的审计历史迁移到 Envers 架构。您只需将遗留系统中的第一个更改条目设为ADD 和其他MOD。当然,如果所有遗留信息都不重要,您当然可以根据需要将最后一个条目迁移为 ADD(假设最后一个遗留更改 = 当前记录快照)。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2011-07-10
  • 2018-03-10
  • 2021-04-01
  • 2019-01-22
  • 2018-04-18
相关资源
最近更新 更多