我们如何根据条件审计实体的字段?

How can we audit a field of an entity according to a condition?

要有条件地审计一个实体,可以选择使用 Integrators 和 extends Envers 事件监听器。 但是我们可以有条件地审核字段或 属性 吗?

在我们的例子中,我们有一个 blob 列,为了避免审计表的体积增加,我们希望仅在条件有效时设置此列的值。有什么办法吗?

谢谢

如前所述,目前唯一的条件审计方法是按照您的描述扩展 Envers 侦听器,通过集成器注册您的自定义侦听器,并确保配置 Envers不要跳过它的事件侦听器注册步骤。

例如,假设您已扩展 EnversPostUpdateEventListenerImpl:

public class CustomPostUpdateEventListener extends EnversPostUpdateEventListenerImpl {
  @Override
  public void onPostUpdate(PostUpdateEvent event) {
    if ( event.getEntity() instanceof YourCustomEntityType ) {
      if ( !isSpecialConditionSet( event ) ) {
        return;
      }
    }
    super.onPostUpdate( event );
  }

  private boolean isSpecialConditionSet(PostUpdateEvent event) {
    final Object conditionValue = event.getPersister()
        .getPropertyValue( event.getEntity(), "nameOfPropertyCondition" );
    /* check your condition and return true if you should not audit the entity */        
  }
}

进行 条件审计 时需要考虑的一件事是,当实体的 PostInsertEvent 被触发时,它应该 而不是 如果您使用 ValidityAuditStrategy 来避免在未来事务中更新该实体时出现下游问题,则被视为有条件的。