这里的简短回答是不,没有。
唯一可用的切换选项是告诉 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 的各个方面可能并且很可能会产生负面影响。