#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