2016-04-21 6 views
1

Мое приложение использует envers для записи данных в таблицы _aud, а также для их переноса в xml, который записывается в другую таблицу. Я делаю это в Envers 4.3 с условным аудитом. Мой класс расширяет EnversIntegratorHibernate Envers 4.3 переход к 5.0 - аудит условных изменений

@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, serviceRegistry.getService(ClassLoaderService.class)); 
    if (enversConfiguration.getEntCfg().hasAuditedEntities()) 
    {   
     listenerRegistry.appendListeners(EventType.POST_UPDATE, new PostUpdateListenerLog(enversConfiguration)); 
     listenerRegistry.appendListeners(EventType.POST_INSERT, new PostInsertListenerLog(enversConfiguration)); 
     listenerRegistry.appendListeners(EventType.POST_DELETE, new PostDeleteListenerLog(enversConfiguration)); 
    } 
} 

В Envers 5,0 AuditConfiguration было удалено (https://github.com/hibernate/hibernate-orm/blob/5.0/migration-guide.adoc) в предпочтении нового org.hibernate.envers.boot.internal.EnversService

так что я изменить мой код, внедрение новой Integrator интерфейс

@Override 
public void integrate(Metadata mtdt, SessionFactoryImplementor sfi, SessionFactoryServiceRegistry serviceRegistry) { 

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

    EnversService enversService = new EnversServiceImpl(); 
    if(enversService.getEntitiesConfigurations().hasAuditedEntities()) { 
     listenerRegistry.appendListeners(EventType.POST_UPDATE, new PostUpdateListenerLog(enversService)); 
     listenerRegistry.appendListeners(EventType.POST_INSERT, new PostInsertListenerLog(enversService)); 
     listenerRegistry.appendListeners(EventType.POST_DELETE, new PostDeleteListenerLog(enversService)); 
    } 

} 

этот код не работает, потому что EnversService не инициализирован, давая мне

java.lang.IllegalStateException: Служба еще не инициализирован в org.hibernate.envers.boot.internal.EnversServiceImpl.getEntitiesConfigurations (EnversServiceImpl.java:253)

Я попытался восстановить EnversService как Я сделал со старой версией AuditConfiguration без каких-либо результатов. Я читал официальное руководство (http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html), и я не нашел ничего, что могло бы мне помочь.

Что я могу сделать, чтобы получить экземпляр EnversService, который можно использовать для моих пользовательских слушателей?

Спасибо, Эндрю

ответ

1

Я декомпилировать класс org.hibernate.envers.boot.internal.EnversIntegrator и найти решение.

@Override 
public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { 

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

    EnversService enversService = serviceRegistry.getService(EnversService.class); 
    if (!enversService.isInitialized()) { 
     throw new HibernateException("Expecting EnversService to have been initialized prior to call to EnversIntegrator#integrate"); 
    } 
    if(enversService.getEntitiesConfigurations().hasAuditedEntities()) { 
     listenerRegistry.appendListeners(EventType.POST_UPDATE, new PostUpdateListenerLog(enversService)); 
     listenerRegistry.appendListeners(EventType.POST_INSERT, new PostInsertListenerLog(enversService)); 
     listenerRegistry.appendListeners(EventType.POST_DELETE, new PostDeleteListenerLog(enversService)); 
    } 
} 

Проблема решена!

Смежные вопросы