Auditoría condicional de Envers
Tengo un requisito donde quiero auditar registros solo en el cambio de campo de Estado. He seguido el tutorial del capítulo de documentación "15.8. Auditoría condicional".
Paso 1: Desactivar el registro automático de oyentes del evento Envers. Tengo los siguientes
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
Paso 2: Crea subclases para los oyentes de eventos apropiados.
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);
}
}
De manera similar, tengo
InsertEnversListenerUpdateEnversListenerDeleteEnversListenerColecciónRecreateEnversListenerPreCollectionRemoveEnversListenerPreCollectionUpdateEnversListenerPaso 3: Crea tu propia implementación deorg.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 ) );
}
}
}
Paso 4: Para que el integrador se use automáticamente cuando se inicie Hibernate, deberá agregar unMETA-INF/services/org.hibernate.integrator.spi.Integrator
expediente. Aquí está el contenido deorg.hibernate.integrator.spi.Integrator
expediente
com.hib.sample.listener.CustomEnversIntegrator
No estoy seguro, si me falta algo. Estoy usando JBOSS AS 7.0 con Hibernate 4.1.8