Условное обновление Spring Envers - PullRequest
0 голосов
/ 23 сентября 2018

Я использую загрузку Spring с Spring Data и Hibernate 5 Envers.Работает нормально.Я не хочу игнорировать обновления, основанные на содержимом поля (например, статус).Я следовал этому руководству и официальной документации hibernate.Однако, когда я пытаюсь реализовать EnversPreUpdateEventListenerImpl, он не найден.Я включил envers в мой pom:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
</dependency>

У меня есть EnversPreCollectionUpdateEventListenerImpl и аналогичные классы, что заставляет меня думать, что мой подход неправильный.У кого-нибудь есть предложение?

1 Ответ

0 голосов
/ 24 сентября 2018

Первый шаг здесь - определить, каких слушателей вам нужно переопределить.По вашему вопросу похоже, что вы определили это.

Первое, что я рекомендую, это предоставить 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.

...