Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java springenvers条件更新_Java_Spring_Hibernate_Spring Data_Hibernate Envers - Fatal编程技术网

Java springenvers条件更新

Java springenvers条件更新,java,spring,hibernate,spring-data,hibernate-envers,Java,Spring,Hibernate,Spring Data,Hibernate Envers,我正在使用SpringBoot和SpringData以及Hibernate5Envers。 它很好用。我不希望忽略基于字段内容的更新(例如状态)。我遵循了这个和hibernate的官方文档。但是,当我尝试实现EnversPreUpdateEventListenerImpl时,找不到它。我的pom中包括了envers: <dependency> <groupId>org.hibernate</groupId> <artifactId>

我正在使用SpringBoot和SpringData以及Hibernate5Envers。 它很好用。我不希望忽略基于字段内容的更新(例如状态)。我遵循了这个和hibernate的官方文档。但是,当我尝试实现EnversPreUpdateEventListenerImpl时,找不到它。我的pom中包括了envers:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
</dependency>

org.hibernate
冬眠使者

我有EnversPreCollectionUpdateEventListenerImpl和类似的类可用,这使我认为我的方法是错误的。有人有什么建议吗?

这里的第一步是确定需要覆盖哪些侦听器。从你的问题看来,你已经决定了

我建议的第一件事是为Hibernate提供
Hibernate.envers.autoRegisterListeners
config属性设置为
false
。这可以确保在调用默认的
EnversIntegrator
时,它跳过事件注册,从而防止默认侦听器连接到
会话工厂

下一步基本上是将
org.hibernate.envers.boot.internal.EnversIntegrator
代码复制到自定义类中。显然,您可以排除侦听器选择退出检查,因为您的自定义实现不需要该检查。您需要更改的是正在注册侦听器的几行,而不是注册您自己的而不是默认的侦听器

比如说

if ( enversService.getEntityConfigurations().hasAuditedEntities() ) {
  // ...
  listenerRegistry.appendListeners( 
    EventType.PRE_UPDATE, 
    new MyCustomEnversPreUpdateEventListener( enversService )
  );
}
其中,
MyCustomEnversPreUpdateEventListener
看起来像这样

public class MyCustomEnversPreUpdateEventListener 
  extends EnversPreUpdateEventListenerImpl {
  @Override
  public void onPreUpdate(PreUpdateEvent event) {
    final String entityName = event.getPersister().getEntityName();
    if ( getEnversService().getEntitiesConfigurations().isVersioned( entityName ) ) {
        checkIfTransactionInProgress( event.getSession() );
        if ( yourFieldStatusMatchesAuditCriteria( event ) ) {
          return super.onPreUpdate( event );
        }
    }
    return false;
  }
}

如果您可以找到所有其他侦听器类,但无法找到更新前的
处理程序,那么很可能您使用的是较旧版本的Envers。值得注意的是,Hibernate Envers最近在5.2.7版中添加了
更新前事件侦听器。

谢谢您的回答。关于hibernate版本,您完全正确。