I have a requirement when I want to check records only when the status field changes. I have completed the tutorial on documentation "15.8. Conditional Audit".
Step 1: Disable automatic registration of event listeners. I have the following:
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
Step 2: Subclass the corresponding event listeners.
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); } }
Similarly, I have
- InsertEnversListener
- UpdateEnversListener
- DeleteEnversListener
- CollectionRecreateEnversListener
- PreCollectionRemoveEnversListener
- PreCollectionUpdateEnversListener
Step 3. Create your own implementation of 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 ) ); } } }
Step 4: To automatically use the integrator when starting Hibernate, you need to add the file META-INF/services/org.hibernate.integrator.spi.Integrator . Here is the contents of the org.hibernate.integrator.spi.Integrator file
com.hib.sample.listener.CustomEnversIntegrator
I am not sure if I will not lose anything. I am using JBOSS AS 7.0 with Hibernate 4.1.8
Shirish bathe
source share