【问题标题】: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:
- 重写 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
}
}
- 您需要将您的自定义 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