2013-01-10 16 views
8

Ho un requisito in cui desidero controllare i record solo sul campo Change of Status. Ho seguito il tutorial del capitolo sulla documentazione "15.8 Controllo condizionale".Audit condizionale Envers

Passaggio 1: Disattiva la registrazione automatica degli ascoltatori di eventi Envers. Ho seguito:

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

Passaggio 2: creare sottoclassi per i listener di eventi appropriati.

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); 
    } 
} 

In modo simile, ho

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

Fase 3: Creare la propria implementazione di 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)); 
     } 

    } 
} 

Fase 4: per l'integratore da utilizzare automaticamente quando Hibernate si avvia, è necessario aggiungere un file META-INF/services/org.hibernate.integrator.spi.Integrator. Ecco il contenuto del file di org.hibernate.integrator.spi.Integrator

com.hib.sample.listener.CustomEnversIntegrator 

non sono sicuro, se mi manca nulla. Sto usando JBoss AS 7.0 con Hibernate 4.1.8

+0

E cosa succede attualmente? Il tuo codice integratore personalizzato è stato chiamato? – adamw

+0

@adamw: ho aggiunto istruzioni sysout al codice dell'integratore, ma nessuna di esse appare. Sembra che i servizi non siano riconosciuti da JBOSS. Ho creato un progetto usando Eclipse 4.2 Juno come progetto Web dinamico. ** Non sono sicuro che la posizione di META-INF sia corretta **. Qualche consiglio .. –

+0

Hai controllato il vaso/guerra risultante, se ha il file nel posto giusto? – adamw

risposta

1

cercare di posizionare il file integratore in:

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

Forse ...

Nel mio caso, io uso Maven, e ho dovuto includere nella riga pom.xml, nella riga seguente: <include>**/*.Integrator</include>, perché il file non è stato inserito nello .ear.

mio pom.xml:

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

creazione di un file org.hibernate.integrator.spi.Integrator (che contiene il nome completo del mio integratore personalizzato) in una cartella META-INF/services/ sotto src/main/resources del mio progetto maven ha reso noto il mio codice integratore personalizzato.

Problemi correlati