如何在 Hibernate Envers 中限制审计类型

How to limit the types of audits in Hibernate Envers

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

据我所知,每次被审核的 table 获得新记录、记录更改或删除记录时,审核 tables 都会获得一条记录。

对于我的实施,我只真正关心更改,并且由于我了解到审计会影响性能,所以我想关闭我不需要的部分。

我很难找到这方面的信息。唯一接近的是我需要关闭所有 Envers 监听器并自己重新实现它们,让我不想要的监听器什么都不做。

这看起来工作量很大,而且我已经进入了未知领域。有谁知道一个简单的方法来做到这一点?如果做不到这一点,是否有人可以分享一些代码来展示如何做到这一点?

谢谢,

这里的简短回答是否定的。

唯一可用且接近的切换选项是告诉 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 修订条目进行审核,该条目描述了它在特定时间使用给定的修订编号进行了修改。

同样,第一个场景将包含 ChildADD 修改后的条目,当它被添加到父集合时。这将包括与 Parent 的第一次修订相同的修订号。

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

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

可以禁止这种行为吗,可以。但这样做的问题是您失去了一些非常有价值的功能。

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

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

您没有详细说明为什么性能真的会成为这里的问题,所以我不一定要谈及具体细节。

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