Conditional Envers Auditing
Ich habe eine Anforderung, bei der ich Datensätze nur bei Änderung des Statusfelds prüfen möchte. Ich habe das Tutorial zum Dokumentationskapitel "15.8. Bedingte Prüfung" befolgt.
Schritt 1: Deaktivieren Sie die automatische Registrierung der Envers-Ereignislistener. Ich habe folgendes:
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
Schritt 2: Erstellen Sie Unterklassen für entsprechende Ereignis-Listener.
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 ähnlicher Weise habe ich
InsertEnversListenerUpdateEnversListenerDeleteEnversListenerCollectionRecreateEnversListenerPreCollectionRemoveEnversListenerPreCollectionUpdateEnversListenerSchritt 3: Erstellen Sie Ihre eigene Implementierung vonorg.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 ) );
}
}
}
Schritt 4: Damit der Integrator beim Start des Ruhezustands automatisch verwendet wird, müssen Sie a hinzufügenMETA-INF/services/org.hibernate.integrator.spi.Integrator
Datei. Hier ist Inhalt vonorg.hibernate.integrator.spi.Integrator
Datei
com.hib.sample.listener.CustomEnversIntegrator
Ich bin mir nicht sicher, ob mir etwas fehlt. Ich verwende JBOSS AS 7.0 mit Hibernate 4.1.8