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

InsertEnversListenerUpdateEnversListenerDeleteEnversListenerCollectionRecreateEnversListenerPreCollectionRemoveEnversListenerPreCollectionUpdateEnversListener

Schritt 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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage