Java springenvers条件更新
我正在使用SpringBoot和SpringData以及Hibernate5Envers。 它很好用。我不希望忽略基于字段内容的更新(例如状态)。我遵循了这个和hibernate的官方文档。但是,当我尝试实现EnversPreUpdateEventListenerImpl时,找不到它。我的pom中包括了envers: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>
<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版本,您完全正确。