Hibernate Envers 条件审计,自定义 EnversIntegrator 在运行时被忽略
Hibernate Envers conditional auditing, custom EnversIntegrator ignored at runtime
我需要使用 Hibernate Envers 和 Spring 配置条件审计。
默认配置有效,但我只想审核删除操作,将删除的实体保存在审核中 table。
我已经关注 all the documentation steps,但是当我尝试使用创建和删除实体的简单 main 应用程序时,我的 CustomEnversIntegrator 没有被调用,而是 org.hibernate.envers.event.spi.EnversIntegrator 被调用。
这是我的 spring-config.xml:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaProperties">
<props>
<prop key="org.hibernate.envers.default_schema">macap_auditoria</prop>
<prop key="org.hibernate.envers.audit_table_prefix">aud_</prop>
<prop key="org.hibernate.envers.audit_table_suffix"></prop>
<prop key="org.hibernate.envers.store_data_at_delete">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
<prop key="org.hibernate.envers.cascade_delete_revision">true</prop>
</props>
</property>
......
CustomEnversIntegrator.java,只监听删除操作:
public class CustomEnversIntegrator extends EnversIntegrator {
private AuditConfiguration enversConfiguration;
@Override
public void integrate(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.prependListeners(EventType.POST_DELETE, new CustomEnversPostDeleteEventListener(enversConfiguration));
}
}
}
最后,我添加了文件 META-INF/services/org。hibernate.spi.Integrator
里面一行:uy.com.macap.ccd.services.persistence.audit.CustomEnversIntegrator
我的 .m2 文件夹中生成的 jar 包含 META-INF/services/org.hibernate.spi.Integrator 文件,所以除了使用 EnversIntegrator 重新编译 envers class 之外,我不知道还能尝试什么由我修改。
谢谢。
我认为问题出在 META-INF/services 下的文件名 :
根据文档,应该是org.hibernate.integrator.spi.Integrator
而不是
org.hibernate.spi.Integrator as in your post
我需要使用 Hibernate Envers 和 Spring 配置条件审计。
默认配置有效,但我只想审核删除操作,将删除的实体保存在审核中 table。
我已经关注 all the documentation steps,但是当我尝试使用创建和删除实体的简单 main 应用程序时,我的 CustomEnversIntegrator 没有被调用,而是 org.hibernate.envers.event.spi.EnversIntegrator 被调用。
这是我的 spring-config.xml:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaProperties">
<props>
<prop key="org.hibernate.envers.default_schema">macap_auditoria</prop>
<prop key="org.hibernate.envers.audit_table_prefix">aud_</prop>
<prop key="org.hibernate.envers.audit_table_suffix"></prop>
<prop key="org.hibernate.envers.store_data_at_delete">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.listeners.envers.autoRegister">false</prop>
<prop key="org.hibernate.envers.cascade_delete_revision">true</prop>
</props>
</property>
......
CustomEnversIntegrator.java,只监听删除操作:
public class CustomEnversIntegrator extends EnversIntegrator {
private AuditConfiguration enversConfiguration;
@Override
public void integrate(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.prependListeners(EventType.POST_DELETE, new CustomEnversPostDeleteEventListener(enversConfiguration));
}
}
}
最后,我添加了文件 META-INF/services/org。hibernate.spi.Integrator 里面一行:uy.com.macap.ccd.services.persistence.audit.CustomEnversIntegrator
我的 .m2 文件夹中生成的 jar 包含 META-INF/services/org.hibernate.spi.Integrator 文件,所以除了使用 EnversIntegrator 重新编译 envers class 之外,我不知道还能尝试什么由我修改。
谢谢。
我认为问题出在 META-INF/services 下的文件名 :
根据文档,应该是org.hibernate.integrator.spi.Integrator
而不是
org.hibernate.spi.Integrator as in your post