Условный аудит Envers

У меня есть требование, где я хочу проверять записи только при изменении поля статуса. Я следовал руководству по документации 15.8. Условный аудит.

Шаг 1: Отключите автоматическую регистрацию слушателей событий Envers. У меня есть следующее:

<prop key="hibernate.listeners.envers.autoRegister">false</prop>

Шаг 2: Создайте подклассы для соответствующих слушателей событий.

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);
    }   
}

Аналогичным образом, у меня есть

InsertEnversListenerUpdateEnversListenerDeleteEnversListenerCollectionRecreateEnversListenerPreCollectionRemoveEnversListenerPreCollectionUpdateEnversListener

Шаг 3: Создайте свою собственную реализацию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 ) );
        }

    }
}

Шаг 4: Для автоматического использования интегратора при запуске Hibernate необходимо добавитьMETA-INF/services/org.hibernate.integrator.spi.Integrator файл. Вот содержаниеorg.hibernate.integrator.spi.Integrator файл

com.hib.sample.listener.CustomEnversIntegrator

Я не уверен, если я что-то упустил. Я использую JBOSS AS 7.0 с Hibernate 4.1.8

Ответы на вопрос(4)

Ваш ответ на вопрос