Первый шаг здесь - определить, каких слушателей вам нужно переопределить.По вашему вопросу похоже, что вы определили это.
Первое, что я рекомендую, это предоставить Hibernate свойство конфигурации hibernate.envers.autoRegisterListeners
, установленное на false
.Это гарантирует, что при вызове EnversIntegrator
по умолчанию он пропускает регистрацию события, предотвращая присоединение прослушивателей по умолчанию к SessionFactory
.
. Следующий шаг - это copy .org.hibernate.envers.boot.internal.EnversIntegrator
код для пользовательского класса.Очевидно, что вы можете исключить проверку отказа слушателя, потому что вашей пользовательской реализации эта проверка не понадобится.Вам нужно будет изменить несколько строк, в которых слушатели регистрируются и вместо этого регистрируют собственные, а не стандартные.
Например,
if ( enversService.getEntityConfigurations().hasAuditedEntities() ) {
// ...
listenerRegistry.appendListeners(
EventType.PRE_UPDATE,
new MyCustomEnversPreUpdateEventListener( enversService )
);
}
Где будет выглядеть MyCustomEnversPreUpdateEventListener
что-то вроде этого
public class MyCustomEnversPreUpdateEventListener
extends EnversPreUpdateEventListenerImpl {
@Override
public void onPreUpdate(PreUpdateEvent event) {
final String entityName = event.getPersister().getEntityName();
if ( getEnversService().getEntitiesConfigurations().isVersioned( entityName ) ) {
checkIfTransactionInProgress( event.getSession() );
if ( yourFieldStatusMatchesAuditCriteria( event ) ) {
return super.onPreUpdate( event );
}
}
return false;
}
}
Если вы можете найти все другие классы слушателей, но не можете найти обработчик pre-update
, скорее всего, вы используете более старую версию Envers.Стоит отметить, что недавно в Hibernate Envers был добавлен прослушиватель событий pre-update
, а точнее версия 5.2.7.