【问题标题】:how to stop auditing create operations in hibernate envers?如何在休眠环境中停止审计创建操作?
【发布时间】:2020-04-14 15:59:00
【问题描述】:

我只想审计更新和删除操作,但是 hibernate envers 也记录了 INSERT 操作,我们怎样才能停止审计插入操作?

application.properties

spring.jpa.properties.org.hibernate.envers.default_catalog=demo_audit
spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true
spring.jpa.properties.hibernate.listeners.envers.autoRegister=false
spring.jpa.properties.hibernate.envers.autoRegisterListeners=false

【问题讨论】:

    标签: hibernate spring-boot hibernate-envers


    【解决方案1】:

    您需要通过事件中断环境 => 查看here 以获取条件审计的详细说明。 这些步骤适用于 spring-boot:

    1. 重写 onPostInsert 方法
    package com.example.stackoverflow1.audit;
    
    import com.example.stackoverflow1.model.Soup;
    import org.hibernate.envers.boot.internal.EnversService;
    import org.hibernate.envers.event.spi.EnversPostInsertEventListenerImpl;
    import org.hibernate.event.spi.PostInsertEvent;
    
    public class CustomAuditEventListenerPostInsert extends EnversPostInsertEventListenerImpl {
    
    
        public CustomAuditEventListenerPostInsert(EnversService enversService) {
            super(enversService);
        }
    
        @Override
        public void onPostInsert(PostInsertEvent event) {
            // super.onPostInsert(event); if this is called, the audit is executed.
            // without it there is no audit entry
        }
    
    }
    
    
    1. 您需要将您的自定义 onPostInsertListener 注册到 envers:
    import lombok.AllArgsConstructor;
    import org.hibernate.envers.boot.internal.EnversService;
    import org.hibernate.event.service.spi.EventListenerRegistry;
    import org.hibernate.event.spi.EventType;
    import org.hibernate.jpa.HibernateEntityManagerFactory;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    
    @Component
    @AllArgsConstructor
    public class AuditConfig {
    
        private HibernateEntityManagerFactory hibernateEntityManagerFactory;
    
        @PostConstruct
        public void registerEnversListeners() {
            EnversService enversService =
                    hibernateEntityManagerFactory
                            .getSessionFactory()
                            .getServiceRegistry()
                            .getService(EnversService.class);
    
            EventListenerRegistry listenerRegistry = hibernateEntityManagerFactory.getSessionFactory().getServiceRegistry().getService(EventListenerRegistry.class);
            listenerRegistry.setListeners(EventType.POST_INSERT, new CustomAuditEventListenerPostInsert(enversService));
        }
    }
    
    

    Edit1:这仅在父实体没有经过审计的子实体时才有效。否则,将在创建之后添加更新的语句。 因此,我还需要stackoverflow 的答案

    Edit2:查看审核条目的手动触发器 - https://developer.jboss.org/thread/274280

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 2017-08-17
      • 1970-01-01
      • 2020-01-07
      • 2017-11-25
      • 2014-03-22
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多