Java 使用Hibernate Envers手动设置修订日期

Java 使用Hibernate Envers手动设置修订日期,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,据我所知,在创建、更改或删除带有@Audited注释的对象时存储修订 Envers会自动将修订日期设置为当前时间。是否可以手动设置此时间 我需要它来处理数据具有有效时间的临时收集,我需要手动设置有效时间。您可以,但一开始可能看起来不直观 当Envers创建其修订实体实例时,会发生一些事情 @RevisionTimestamp注释的属性设置为当前时间 调用可选的RevisionListener,并将其提供给修订实体实例 您可以通过两种方式指定RevisionListener,这实际上取决于您当前提

据我所知,在创建、更改或删除带有@Audited注释的对象时存储修订

Envers会自动将修订日期设置为当前时间。是否可以手动设置此时间


我需要它来处理数据具有有效时间的临时收集,我需要手动设置有效时间。

您可以,但一开始可能看起来不直观

当Envers创建其修订实体实例时,会发生一些事情

  • @RevisionTimestamp
    注释的属性设置为当前时间
  • 调用可选的
    RevisionListener
    ,并将其提供给修订实体实例
  • 您可以通过两种方式指定
    RevisionListener
    ,这实际上取决于您当前提供的自定义修订实体实例或使用的实例环境是否根据您的设置进行解析

    提供自定义修订实体 在这种情况下,您可以通过在实体类的
    @RevisionEntity
    类注释上设置
    RevisionListener
    来指定您的
    RevisionListener

    @RevisionEntity(YourCustomRevisionListener.class)
    public class CustomRevisionEntity {
      ...
    }
    
    通过配置提供修订侦听器 在这种情况下,您需要通过
    Hibernate.properties
    文件或在显式设置Hibernate配置属性的代码中为Hibernate添加额外的引导配置属性:

    org.hibernate.envers.revision_listener=com.company.envers.YourCustomRevisionListener
    
    无论采用哪种方法,都将实现侦听器的约定,并根据应用程序需要的任何规则显式设置时间戳值:

    public class YourCustomRevisionListener implements RevisionListener {
      @Override
      public void newRevision(Object revisionEntity) {
        // I am going to assume here you're using a custom revision entity.
        // If you are not, you'll need to cast it to the appropriate class implementation.
        final CustomRevisionEntity revisionEntityImpl = (CustomRevisionEntity) revisionEntity;
        revisionEntityImpl.setTimestamp( resolveValidTimestampValue() );
      }
    
      private long resolveValidTimestampValue() {
        // implement your logic here.
      }
    }
    
    这里有几个警告。如果需要解析应用程序空间中某个bean的值,则需要确定以下哪项适用于您:

    使用Hibernate Envers 5.3之前的版本 在这种情况下,您必须使用ThreadLocal变量的传统方法来传递应用程序范围实例/值,以访问侦听器中的实例/值

    在CDI中使用Hibernate Envers 5.3或更高版本 在这种情况下,您可以简单地使用CDI的注入注入CDIBean,因为我们添加了在创建侦听器实例时自动解析CDIBean的支持

    在Spring5.1中使用HibernateEnvers5.3或更高版本+ 您可以使用spring的注入注释将Springbean直接注入监听器,就像监听器是Springbean一样

    在5.1之前的Spring中使用Hibernate Envers 5.3或更高版本
    在这种情况下,您将需要使用ThreadLocal变量的传统方法,因为Spring Framework直到5.1才添加对将bean注入Hibernate bean的支持。

    您可以,但一开始可能看起来并不直观

    当Envers创建其修订实体实例时,会发生一些事情

  • @RevisionTimestamp
    注释的属性设置为当前时间
  • 调用可选的
    RevisionListener
    ,并将其提供给修订实体实例
  • 您可以通过两种方式指定
    RevisionListener
    ,这实际上取决于您当前提供的自定义修订实体实例或使用的实例环境是否根据您的设置进行解析

    提供自定义修订实体 在这种情况下,您可以通过在实体类的
    @RevisionEntity
    类注释上设置
    RevisionListener
    来指定您的
    RevisionListener

    @RevisionEntity(YourCustomRevisionListener.class)
    public class CustomRevisionEntity {
      ...
    }
    
    通过配置提供修订侦听器 在这种情况下,您需要通过
    Hibernate.properties
    文件或在显式设置Hibernate配置属性的代码中为Hibernate添加额外的引导配置属性:

    org.hibernate.envers.revision_listener=com.company.envers.YourCustomRevisionListener
    
    无论采用哪种方法,都将实现侦听器的约定,并根据应用程序需要的任何规则显式设置时间戳值:

    public class YourCustomRevisionListener implements RevisionListener {
      @Override
      public void newRevision(Object revisionEntity) {
        // I am going to assume here you're using a custom revision entity.
        // If you are not, you'll need to cast it to the appropriate class implementation.
        final CustomRevisionEntity revisionEntityImpl = (CustomRevisionEntity) revisionEntity;
        revisionEntityImpl.setTimestamp( resolveValidTimestampValue() );
      }
    
      private long resolveValidTimestampValue() {
        // implement your logic here.
      }
    }
    
    这里有几个警告。如果需要解析应用程序空间中某个bean的值,则需要确定以下哪项适用于您:

    使用Hibernate Envers 5.3之前的版本 在这种情况下,您必须使用ThreadLocal变量的传统方法来传递应用程序范围实例/值,以访问侦听器中的实例/值

    在CDI中使用Hibernate Envers 5.3或更高版本 在这种情况下,您可以简单地使用CDI的注入注入CDIBean,因为我们添加了在创建侦听器实例时自动解析CDIBean的支持

    在Spring5.1中使用HibernateEnvers5.3或更高版本+ 您可以使用spring的注入注释将Springbean直接注入监听器,就像监听器是Springbean一样

    在5.1之前的Spring中使用Hibernate Envers 5.3或更高版本 在本例中,您将需要使用ThreadLocal变量的传统方法,因为Spring框架直到5.1才添加对将bean注入Hibernate bean的支持