如何在 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
修订条目进行审核,该条目描述了它在特定时间使用给定的修订编号进行了修改。
同样,第一个场景将包含 Child
的 ADD
修改后的条目,当它被添加到父集合时。这将包括与 Parent
的第一次修订相同的修订号。
第二个场景将包含 Child
修改后的 MOD
修改条目。根据父集合的类型,您所做的更改是否会影响集合的顺序,Parent
实体也可能会触发 MOD
。
当 Child
从集合中删除时,最后一个场景将包含 DEL
修订条目和 MOD
因为父级状态已修改。
可以禁止这种行为吗,可以。但这样做的问题是您失去了一些非常有价值的功能。
例如,Parent
仅包含您实际修改 Parent
的 属性 时的审核行,而不包含您修改与其关联的任何集合属性时的审核行。这意味着在一个简单的示例中,Parent
将只有 1 个审计行,即插入时的 ADD
。
但是,如果您需要知道 Parent
在更改子集合后的每个修订步骤中的实际状态怎么办?好吧,你不能。
您没有详细说明为什么性能真的会成为这里的问题,所以我不一定要谈及具体细节。
但是,如果您这样做,试图关闭 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
修订条目进行审核,该条目描述了它在特定时间使用给定的修订编号进行了修改。
同样,第一个场景将包含 Child
的 ADD
修改后的条目,当它被添加到父集合时。这将包括与 Parent
的第一次修订相同的修订号。
第二个场景将包含 Child
修改后的 MOD
修改条目。根据父集合的类型,您所做的更改是否会影响集合的顺序,Parent
实体也可能会触发 MOD
。
当 Child
从集合中删除时,最后一个场景将包含 DEL
修订条目和 MOD
因为父级状态已修改。
可以禁止这种行为吗,可以。但这样做的问题是您失去了一些非常有价值的功能。
例如,Parent
仅包含您实际修改 Parent
的 属性 时的审核行,而不包含您修改与其关联的任何集合属性时的审核行。这意味着在一个简单的示例中,Parent
将只有 1 个审计行,即插入时的 ADD
。
但是,如果您需要知道 Parent
在更改子集合后的每个修订步骤中的实际状态怎么办?好吧,你不能。
您没有详细说明为什么性能真的会成为这里的问题,所以我不一定要谈及具体细节。
但是,如果您这样做,试图关闭 Envers 的某些方面可能并且很可能会从审计的角度产生负面影响。