Java 环境-插入@NotAudited字段的实际值

Java 环境-插入@NotAudited字段的实际值,java,hibernate,jpa,hibernate-envers,Java,Hibernate,Jpa,Hibernate Envers,我们有一个具有字符串属性的实体,该属性可能会经常更改,因此我们在其上使用了@NotAudited。但这会导致audit表中的列为null(可以理解) 如果实体(其中一个已审核列)发生更改,我们希望将字符串属性的实际值插入审核表,但如果所述字符串属性发生更改,我们不希望将新记录插入审核表 我该怎么做呢?您所描述的是我们所说的条件审核,您可以在Envers文档中找到详细信息 基本原则是,您将继续使用@Audited注释属性,但要确定在PostUpdateEvent期间是否有任何其他属性最有可能发生更

我们有一个具有字符串属性的实体,该属性可能会经常更改,因此我们在其上使用了
@NotAudited
。但这会导致audit表中的列为null(可以理解)

如果实体(其中一个已审核列)发生更改,我们希望将字符串属性的实际值插入审核表,但如果所述字符串属性发生更改,我们不希望将新记录插入审核表


我该怎么做呢?

您所描述的是我们所说的条件审核,您可以在Envers文档中找到详细信息

基本原则是,您将继续使用
@Audited
注释属性,但要确定在
PostUpdateEvent
期间是否有任何其他属性最有可能发生更改,以及您的特定属性是否都发生了更改,您不会将
PostUpdateEvent
委托给Envers默认侦听器实现

某些伪代码可能如下所示:

public class CustomEnversPostUpdateEventListener 
       extends EnversPostUpdateEventListenerImpl {
    public CustomEnversPostUpdateEventListener(EnversService enversService) {
      super( enversService );
    }

    @Override
    public void onPostUpdate(PostUpdateEvent event) {
      final String entityName = event.getPersister().getEntityName();
      if ( getEnversService().getEntityConfigurations().isVersioned( entityName ) ) {
         if ( MySpecialEntity.class.getName().equals( entityName ) ) {
           // Compare event.getState() against event.getOldState()
           // Determine if only your special String changed or not
           if ( !otherFieldsChangedBesidesSpecialProperty ) { 
             return;
           }
         }
         // delegate to default implementation
         super.onPostUpdate( event );
      }
    }
}
编写本报告时所需的方法要求您也重写
EnversIntegrator
中的侦听器注册。扩展这些侦听器,需要状态比较的工作知识,这会给用户带来很大的负担,而不是提供可插入的解决方案

可插拔解决方案是其背后的目标。我想介绍的是一个类似JPA的概念,在这个概念中,
@AuditListener
可以放在被审计实体类上,而Envers会将此行为委托给侦听器实现

关于这将如何工作,目前还没有定论,因此以下只是我个人对这件事的想法,以及它的外观和代码方面的表现:

public class MyEntityAuditListener extends AbstractAuditListener {
    @Override
    public boolean onPostUpdate(EnversPostUpdateEvent event) {
      // return true = allow the audit operation
      // return false = veto the audit operation
      if ( event.getPropertyChangeCount() != 1 ) {
        return true;
      }
      return !event.isPropertyChanged( "mySpecialString" );       
    }
}

@Entity
@Audited
@AuditListener(MyEntityAuditListener.class)
public class MyEntity {
  // ...
  private string mySpecialString;
}
很好的一点是,
enverspositionpdateevent
允许我们将许多Envers内部构件抽象出来,公开一个干净的API,允许用户轻松决定是否否决审核操作,而无需了解很多Hibernate事件或Envers内部的工作原理


正如JIRA所指出的,我计划在未来几个月的Hibernate Envers 6.0的下一个主要版本中引入这个新的
@AuditListener
概念。

如果在5.X版本中提供这个概念,我会非常喜欢:)