hibernate envers 4: включить удаление listenert

Мне нужна ваша помощь: я использую hibernate envers 4.1.12, и я хотел бы включить только прослушиватель удаления, но я не могу это сделать. Я знаю, что начиная с hibernate 4 больше не нужно объявлять слушателя в файле конфигурации, но по умолчанию все операции запускаются в таблицах аудита, и мне нужно отслеживать только те, которые удаляются.

Не могли бы вы помочь мне?

Заранее спасибо.


person Pirulino    schedule 14.05.2014    source источник


Ответы (3)


Взгляните на Условное прослушивание раздел в руководстве.

По сути, вам нужно:

  • отключить автоматическую регистрацию слушателя
  • напишите пользовательский Integrator, который использует только delete прослушиватель (на основе EnversIntegrator)
  • настроить интегратор
person adamw    schedule 15.05.2014
comment
Да, вот так я и решил. Я действительно должен сказать, что этот подход действительно плох с моей точки зрения. Старый способ был намного лучше. В любом случае спасибо за помощь. - person Pirulino; 17.05.2014

Я говорю вам, что я сделал: поскольку я использую maven, структура проекта хорошо известна [ссылка] (http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html). Поэтому в src / main / resources я создал папку META-INF / services / и добавил файл с пометкой org.hibernate.integrator.spi.Integrator. Файл содержит имя класса, реализующего интерфейс EnversIntegrator (в моем случае: eu.dada.prov.sitelock.common.listener.CustomHibernateListenerIntegrator) Вот и все.

Класс:

@Component
public class CustomHibernateListenerIntegrator extends EnversIntegrator {
@Override
public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory,
        SessionFactoryServiceRegistry serviceRegistry) {

    EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);
    listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE);

    final AuditConfiguration enversConfiguration = AuditConfiguration.getFor(configuration);

    if (enversConfiguration.getEntCfg().hasAuditedEntities()) {
        listenerRegistry.appendListeners(EventType.POST_DELETE, new DeleteEnversListener(enversConfiguration));
        listenerRegistry.appendListeners(EventType.PRE_UPDATE, new UpdateEnversListener(enversConfiguration));
        listenerRegistry.appendListeners(EventType.LOAD, new ProductLoadEventListener());
    }
}
}

Надеюсь, это поможет.

person Pirulino    schedule 16.02.2015

Весенняя загрузка 1.5.6

У меня была такая же проблема с использованием более позднего Hibernate с on cascade delete: envers хотели вставить запись, которая ссылалась на удаленный идентификатор, что привело к нарушению ограничения.

Просто добавляю этот ответ, на случай, если кто-то сочтет его полезным.

Отключите все прослушиватели envers в application.properties (и вашу эквивалентную тестовую конфигурацию, если она у вас есть).

spring.jpa.properties.hibernate.envers.autoRegisterListeners=false

Добавьте те, которые вы хотите (здесь я хочу только вставить и обновить).

 @Component
 public class HibernateListenerConfigurer
 {
   @PersistenceUnit
   private EntityManagerFactory entityManagerFactory;

   @PostConstruct
   protected void init()
   {
      SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class);
      EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
      EnversService enversService = sessionFactory.getServiceRegistry().getService(EnversService.class);

      registry.getEventListenerGroup(EventType.POST_INSERT).appendListener(new EnversPostInsertEventListenerImpl(enversService));
      registry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(new EnversPostUpdateEventListenerImpl(enversService));
   }
}
person Community    schedule 26.08.2017