实施条件环境审核(Hibernate 4.3.7.Final)

实施条件环境审核(Hibernate 4.3.7.Final),hibernate,hibernate-envers,Hibernate,Hibernate Envers,我希望审核实体中的所有属性,但仅当某些属性已更改时才进行审核。 按照文档()中描述的步骤,我创建了自己的EnversIntegrator实现: public class EnversIntegrator extends org.hibernate.envers.event.spi.EnversIntegrator { private static final Logger log = LoggerFactory.getLogger(EnversIntegrator.class); priva

我希望审核实体中的所有属性,但仅当某些属性已更改时才进行审核。 按照文档()中描述的步骤,我创建了自己的EnversIntegrator实现:

public class EnversIntegrator extends org.hibernate.envers.event.spi.EnversIntegrator {
private static final Logger log = LoggerFactory.getLogger(EnversIntegrator.class);  
private AuditConfiguration enversConfiguration;
@Override
public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
    log.debug(".... integrate");
    final EventListenerRegistry listenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);
    listenerRegistry.addDuplicationStrategy(EnversListenerDuplicationStrategy.INSTANCE);
    enversConfiguration = AuditConfiguration.getFor(configuration, serviceRegistry.getService(ClassLoaderService.class));
    if (enversConfiguration.getEntCfg().hasAuditedEntities()) {
        log.debug(".... Register listeners");
        listenerRegistry.prependListeners(EventType.POST_DELETE, new MyPostDeleteEventListener(enversConfiguration));
        listenerRegistry.prependListeners(EventType.POST_INSERT, new MyPostInsertEnversEventListener(enversConfiguration));
        listenerRegistry.prependListeners(EventType.POST_UPDATE, new  MyPostUpdateEnversEventListener(enversConfiguration));
    }
}
@Override
public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
    if (enversConfiguration != null) {
        enversConfiguration.destroy();
    }
}
其中:

MyPostInsertEnversEventListener extends org.hibernate.envers.event.spi.EnversPostInsertEventListenerImpl

重写OnPositUpdate或onPostInsert(PostInsertEvent evt)无效,每次执行测试时,都会在_AUD表中添加一条新记录

public void onPostUpdate(PostUpdateEvent evt) {     
    LOG.debug(" ... onPostUpdate " + evt.getEntity().getClass());
//here is my logic who decide if the super.onPostUpdate(evt) must be call or not  
//But NO  super.onPostUpdate(evt); is called !!!!!
}

更新地址实体booth onPostUpdate和onPostInsert称为:

[DEBUG] xxxx.hibernate.MyPostUpdateEnversEventListener -  ... onPostUpdate class xxxxxxx.model.Address
[DEBUG] xxxx.hibernate.MyPostInsertEnversEventListener -  ... onPostInsert class org.hibernate.envers.DefaultRevisionEntity
[DEBUG] xxxx.hibernate.MyPostInsertEnversEventListener -  ... onPostInsert class java.util.HashMap
如何防止在_aud表中创建此新记录


非常感谢

您需要对事件侦听器(例如,
PostInsertInverseEventListener
)进行子cass,在那里执行条件审核检查,如果检查通过,则调用super方法。

调试代码我意识到org.hibernate.envers.event.spi.EnversIntegrator中的“integrate”方法也被调用。事实上,我在spring配置中错放了“hibernate.listeners.envers.autoRegister”参数。这是我的工作配置:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="myTestDataSource" />
    <property name="packagesToScan" value="xyz.**.model" />

    <property name="jpaVendorAdapter" ref="jpaAdapter" />
    <property name="jpaProperties">
        <props>             
                      <prop key="hibernate.hbm2ddl.auto">validate</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.listeners.envers.autoRegister">false</prop>
        </props>
    </property>
    <property name="persistenceXmlLocation"
        value="classpath:spring/app-persistence.xml" />
</bean>

验证
假的
真的
假的

Thx Adam four是您伟大的作品。

对于较新版本,属性是
hibernate.envers.autoRegisterListeners
而不是
hibernate.listeners.envers.autoRegister

最后一个只是一个遗留问题。您可以为此检查
EnversIntegrator
EnversServiceImpl

对于spring boot,您可以设置为:

spring.jpa.properties.hibernate.envers.autoRegisterListeners=false

PostInsertInverseEventListener(现在是MyPostInsertInverseEventListener)是我的实现。我没有调用super.onPostInsert(evt)或super.onPostUpdate。我ve减少我的测试只是为了看看我是否可以控制这个插入。更新我的实体时,Envers使用我的测试实体调用onPostUpdate,使用org.hibernate.Envers.DefaultRevisionEntity和java.util.HashMap调用两次onPostInsert。显然,另一个侦听器在_AUD中插入了一条新记录,完全忽略了我的代码。我想知道在jQuery中Envers是否有类似event.preventDefault()的东西。
spring.jpa.properties.hibernate.envers.autoRegisterListeners=false