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

问题描述 投票:0回答:1

据我所知,当您创建,更改或删除使用@Audited注释的对象时,Hibernate Envers会存储修订版。

Envers自动将修订日期设置为当前时间。可以手动设置这个时间吗?

我需要这个来处理数据有效时间的时间集合,我需要手动设置。

java hibernate hibernate-envers
1个回答
1
投票

你可以,但一开始可能看起来不太直观。

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

  1. @RevisionTimestamp注释属性设置为当前时间。
  2. 可选的RevisionListener被调用并提供了revision-entity实例。

您可以通过两种方式指定RevisionListener,这实际上取决于您当前提供的自定义修订实体实例或使用实例Envers是否根据您的设置进行解析。

提供自定义修订实体

在这种情况下,您可以通过在实体类的RevisionListener类注释上设置@RevisionEntity来指定它。

@RevisionEntity(YourCustomRevisionListener.class)
public class CustomRevisionEntity {
  ...
}

通过配置提供RevisionListener

在这种情况下,您需要为Hibernate添加额外的引导程序配置属性,可以通过hibernate.properties文件,也可以在显式设置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解析值,则需要确定以下哪个适用于您:

Using Hibernate Envers version prior to 5.3

在这种情况下,您将不得不使用ThreadLocal变量的传统方法来传递应用程序范围实例/值以访问侦听器内的那些。

Using Hibernate Envers 5.3 or later with CDI

在这种情况下,您可以使用CDI注入简单地注入CDI bean,因为我们在创建侦听器实例时添加了自动解析CDI bean的支持。

Using Hibernate Envers 5.3 or later with Spring 5.1+

你可以使用Spring的注入注释将spring bean直接注入到监听器中,就像监听器是一个spring-bean一样。

Using Hibernate Envers 5.3 or later with Spring prior to 5.1

在这种情况下,您需要使用ThreadLocal变量的遗留方法,因为Spring Framework没有添加对将bean注入Hibernate bean的支持,直到5.1。

© www.soinside.com 2019 - 2024. All rights reserved.