【发布时间】:2014-07-02 16:58:25
【问题描述】:
我需要您的帮助:我正在使用 hibernate envers 4.1.12,我只想启用删除侦听器,但我无法做到。 我知道从 hibernate 4 开始不再需要在配置文件中声明监听器,但默认情况下所有操作都在审计表中触发,我只需要监控删除的操作。
你能帮帮我吗?
提前致谢。
【问题讨论】:
标签: java spring hibernate hibernate-envers
我需要您的帮助:我正在使用 hibernate envers 4.1.12,我只想启用删除侦听器,但我无法做到。 我知道从 hibernate 4 开始不再需要在配置文件中声明监听器,但默认情况下所有操作都在审计表中触发,我只需要监控删除的操作。
你能帮帮我吗?
提前致谢。
【问题讨论】:
标签: java spring hibernate hibernate-envers
查看手册中的Conditional audition 部分。
你基本上需要做的是:
Integrator,它只使用delete 监听器(基于EnversIntegrator)【讨论】:
我告诉你我做了什么:因为我使用的是 maven,所以项目结构是众所周知的 [link] (http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html)。因此,在 src/main/resources 我创建了一个文件夹 META-INF/services/ 并添加了一个标记为 org.hibernate.integrator.spi.Integrator 的文件。该文件包含实现 EnversIntegrator 接口的类的名称(在我的例子中:eu.dada.prov.sitelock.common.listener.CustomHibernateListenerIntegrator)就是这样。
班级是:
@Component
public class CustomHibernateListenerIntegrator extends EnversIntegrator {
@Override
public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);
listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE);
final AuditConfiguration enversConfiguration = AuditConfiguration.getFor(configuration);
if (enversConfiguration.getEntCfg().hasAuditedEntities()) {
listenerRegistry.appendListeners(EventType.POST_DELETE, new DeleteEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.PRE_UPDATE, new UpdateEnversListener(enversConfiguration));
listenerRegistry.appendListeners(EventType.LOAD, new ProductLoadEventListener());
}
}
}
希望对你有帮助。
【讨论】:
Spring Boot 1.5.6
我在使用带有on cascade delete 的更新版 Hibernate 时遇到了同样的问题:envers 想要插入一条引用已删除 ID 的记录,从而引发了约束冲突。
只需添加此答案,以防有人发现它有用。
关闭 application.properties 中的所有 envers 侦听器(以及等效的测试配置,如果有的话)。
spring.jpa.properties.hibernate.envers.autoRegisterListeners=false
添加你想要的(这里我只想插入和更新)。
@Component
public class HibernateListenerConfigurer
{
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
@PostConstruct
protected void init()
{
SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class);
EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
EnversService enversService = sessionFactory.getServiceRegistry().getService(EnversService.class);
registry.getEventListenerGroup(EventType.POST_INSERT).appendListener(new EnversPostInsertEventListenerImpl(enversService));
registry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(new EnversPostUpdateEventListenerImpl(enversService));
}
}
【讨论】: