2013-01-10 22 views
8

Mam wymaganie, w którym chcę kontrolować rekordy tylko w przypadku zmiany pola Status. Przestudiowałem rozdział poświęcony dokumentacji "15.8 Kontrola warunkowa".Kontrola warunkowa enumeratorska

Krok 1: Wyłącz automatyczne rejestrowanie detektorów zdarzeń Envers. Mam następujące:

<prop key="hibernate.listeners.envers.autoRegister">false</prop> 

Krok 2: Utwórz podklasy dla odpowiednich odbiorców.

public class DeleteEnversListener extends EnversPostDeleteEventListenerImpl { 
    private static final long serialVersionUID = 5906427978349712224L; 
    private static Log log = LogFactory.getLog(DeleteEnversListener.class); 

    public DeleteEnversListener(AuditConfiguration enversConfiguration) { 
     super(enversConfiguration); 
    } 

    @Override 
    public void onPostDelete(PostDeleteEvent event) { 
     log.info("!!! just logging entity !! "+ event.getEntity()); 
     super.onPostDelete(event); 
    } 
} 

W podobny sposób, mam

  • InsertEnversListener
  • UpdateEnversListener
  • DeleteEnversListener
  • CollectionRecreateEnversListener
  • PreCollectionRemoveEnversListener
  • PreCollectionUpdateEnversL istener

Krok 3: Stwórz własną implementację org.hibernate.integrator.spi.Integrator

public class CustomEnversIntegrator extends EnversIntegrator { 

    private static Log log = LogFactory.getLog(CustomEnversIntegrator.class); 

    @Override 
    public void integrate(Configuration configuration, 
      SessionFactoryImplementor sessionFactory, 
      SessionFactoryServiceRegistry serviceRegistry) { 

     super.integrate(configuration, sessionFactory, serviceRegistry); 
     final AuditConfiguration enversConfiguration = AuditConfiguration.getFor(configuration, serviceRegistry.getService(ClassLoaderService.class)); 
     EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class); 

     System.out.println("Registering event listeners"); 
     if (enversConfiguration.getEntCfg().hasAuditedEntities()) { 
      listenerRegistry.appendListeners(EventType.POST_INSERT, new InsertEnversListener(enversConfiguration)); 
      listenerRegistry.appendListeners(EventType.POST_UPDATE, new UpdateEnversListener(enversConfiguration)); 
      listenerRegistry.appendListeners(EventType.POST_DELETE, new DeleteEnversListener(enversConfiguration)); 
      listenerRegistry.appendListeners(EventType.POST_COLLECTION_RECREATE, new CollectionRecreateEnversListener(enversConfiguration)); 
      listenerRegistry.appendListeners(EventType.PRE_COLLECTION_REMOVE, new PreCollectionRemoveEnversListener(enversConfiguration)); 
      listenerRegistry.appendListeners(EventType.PRE_COLLECTION_UPDATE, new PreCollectionUpdateEnversListener(enversConfiguration)); 
     } 

    } 
} 

Krok 4: Na integrator być stosowane automatycznie po uruchomieniu hibernacji, trzeba będzie dodać plik META-INF/services/org.hibernate.integrator.spi.Integrator. Oto treść org.hibernate.integrator.spi.Integrator pliku

com.hib.sample.listener.CustomEnversIntegrator 

Nie jestem pewien, czy jestem brakuje niczego. Używam JBoss AS 7.0 z Hibernate 4.1.8

+0

Co się dzieje obecnie? Czy Twój niestandardowy kod integratora jest w ogóle wywoływany? – adamw

+0

@adamw: Dodałem instrukcje sysout do kodu integratora, ale żadne z nich się nie pojawiają. Wygląda na to, że usługi nie są rozpoznawane przez JBOSS. Stworzyłem projekt przy użyciu Eclipse 4.2 Juno jako projektu Dynamic Web. ** Nie jestem pewien, czy Lokalizacja META-INF jest poprawna **. Każda rada ... –

+0

Czy sprawdziłeś wynikowy słoik/wojnę, czy plik jest w odpowiednim miejscu? – adamw

Odpowiedz

1

spróbować umieścić plik integrator do:

sample.war\WEB-INF\classes\META-INF\services\... 
0

może ...

W moim przypadku Używam Maven, i musiałem to w numerze pom.xml, następujący wiersz: <include>**/*.Integrator</include>, ponieważ plik nie został spakowany w numerze .ear.

My pom.xml:

<resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/*.xml</include> 
       <include>**/*.Integrator</include> 
      </includes> 
     </resource> 
     ... 
0

Tworzenie pliku org.hibernate.integrator.spi.Integrator (zawierający kwalifikowaną nazwę mojego niestandardowego integratora) w folderze META-INF/services/ pod src/main/resources z mojego projektu maven sprawił, że mój niestandardowy kod integratora został wywołany.