Как мы можем провести аудит поля объекта в соответствии с условием?

#hibernate-envers

#hibernate-envers

Вопрос:

Для проведения аудита объекта условно существует возможность использования интеграторов и расширенных источников информации о событиях Envers. Но можем ли мы провести аудит поля или свойства условно?

В нашем случае у нас есть столбец blob, и чтобы избежать увеличения объема таблиц аудита, мы хотим установить значение этого столбца только тогда, когда условие действительно. Есть ли какой-либо способ сделать это?

Спасибо

Ответ №1:

Как указано, текущий и единственный способ выполнить условный аудит — это расширить прослушиватели 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 */        
  }
}
  

Одна вещь, которую следует учитывать при выполнении условного аудита, заключается в том, что когда запускается a для объекта, его не следует считать условным, если вы используете, чтобы избежать проблем при обновлении этого объекта в будущей транзакции. PostInsertEvent ValidityAuditStrategy