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
E cosa succede attualmente? Il tuo codice integratore personalizzato è stato chiamato? – adamw
@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 .. –
Hai controllato il vaso/guerra risultante, se ha il file nel posto giusto? – adamw