如何防止使用Envers 4 Hibernate进行插入审计

如何防止使用Envers 4 Hibernate进行插入审计

问题描述:

我正在使用带有envers的Hibernate 4.0

I am using Hibernate 4.0 with envers

当我进行更新或插入时,数据将以0和1模式保存到审计表中

When I do an update or insert, data is getting saved into audit table with mode a 0 and 1

我想在插入后禁用审核.有人可以,请让我知道如何禁用它.

I would like to disable audit on post-insert. can someone please, let me know how to disable it.

我已经阅读过从4.0版休眠的信息,它会自动注册事件以进行审核.

I have read that hibernate from version 4.0, it automatically registers the events for auditing.

我有一种方法可以在插入时禁用审核吗?

I there a way we can disable audit on insert?

hibernate.envers.autoRegisterListeners-控制是否自动注册标准Envers侦听器.

hibernate.envers.autoRegisterListeners - controls whether the standard Envers listeners are auto-registered.

您可以注册自定义侦听器,以允许或阻止自定义事件起作用.

You can register custom listeners to allow or prevent custom event to work.

这是休眠指南中的步骤:

Here is steps from hibernate guide:

  1. 通过将hibernate.listeners.envers.autoRegisterHibernate属性设置为false来关闭自动Envers事件侦听器注册.
  2. 为适当的事件侦听器创建子类.例如,如果您要有条件地审核实体插入,请扩展org.hibernate.envers.eventEnversPostInsertEventListenerImpl类.将条件审核逻辑放在子类中,如果应执行审核,则调用super方法.
  3. 创建自己的org.hibernate.integrator.spi.Integrator实现,类似于org.hibernate.envers.event.EnversIntegrator.使用事件侦听器类而不是默认的类.
  4. 要使Hibernate启动时自动使用积分器,您需要将aMETA-INF/services/org.hibernate.integrator.spi.Integrator文件添加到jar中.该文件应包含实现该接口的类的标准名称.

有关更多详细信息,请转到链接代码示例

import org.hibernate.envers.configuration.spi.AuditConfiguration;
import org.hibernate.envers.event.spi.EnversPostInsertEventListenerImpl;
import org.hibernate.event.spi.PostInsertEvent;

public class SprEnversPostInsertEventListenerImpl extends EnversPostInsertEventListenerImpl {

    private static final long serialVersionUID = 1L;

    public SprEnversPostInsertEventListenerImpl(AuditConfiguration enversConfiguration) {
        super(enversConfiguration);
    }

    @Override
    public void onPostInsert(PostInsertEvent event) {
        super.onPostInsert(event);
    }

}

自定义集成商的代码示例

custom integrator's Code sample

    public class EnverseCustomIntegrator extends EnversIntegrator {

    public static final String  AUTO_REGISTER   = "hibernate.listeners.envers.autoRegister";
    private AuditConfiguration  enversConfiguration;

    @Override
    public void integrate(org.hibernate.cfg.Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {



        final EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);
        listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE);

        enversConfiguration = AuditConfiguration.getFor(configuration, serviceRegistry.getService(ClassLoaderService.class));

        if (enversConfiguration.getEntCfg().hasAuditedEntities()) {
            listenerRegistry.appendListeners(EventType.POST_DELETE, new SprEnversPostDeleteEventListenerImpl(enversConfiguration));
            listenerRegistry.appendListeners(EventType.POST_INSERT, new SprEnversPostInsertEventListenerImpl(enversConfiguration));
            listenerRegistry.appendListeners(EventType.POST_UPDATE, new SprEnversPostUpdateEventListenerImpl(enversConfiguration));
            listenerRegistry.appendListeners(EventType.POST_COLLECTION_RECREATE, new SprEnversPostCollectionRecreateEventListenerImpl(enversConfiguration));
            listenerRegistry.appendListeners(EventType.PRE_COLLECTION_REMOVE, new SprEnversPreCollectionRemoveEventListenerImpl(enversConfiguration));
            listenerRegistry.appendListeners(EventType.PRE_COLLECTION_UPDATE, new SprEnversPreCollectionUpdateEventListenerImpl(enversConfiguration));
        }

    }
}

持久性上下文配置

            <property name="hibernate.integration.envers.enabled" value="true"/>
        <property name="hibernate.envers.autoRegisterListeners" value="true"/>

src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator内容示例为:

src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator content sample is:

mycustom.audit.package.audit.EnverseCustomIntegrator