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

标签 java hibernate hibernate-envers

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

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

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

最佳答案

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

当 Envers 创建其修订实体实例时,会发生几件事。

  1. @RevisionTimestamp 带注释的属性设置为当前时间。
  2. 调用可选的 RevisionListener 并提供修订实体实例。

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

提供自定义修订实体

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

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

通过配置提供 RevisionListener

在这种情况下,您需要通过 hibernate.properties 文件或在显式设置 Hibernate 配置属性的代码中为 Hibernate 添加额外的引导配置属性:

org.hibernate.envers.revision_listener=com.company.envers.YourCustomRevisionListener

无论您采用哪种方法,您都将实现监听器的契约(Contract)并根据您的应用程序需要的任何规则显式设置时间戳值:

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 的值,您需要确定以下哪一项适用于您:

使用 5.3 之前的 Hibernate Envers 版本

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

将 Hibernate Envers 5.3 或更高版本与 CDI 结合使用

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

将 Hibernate Envers 5.3 或更高版本与 Spring 5.1+ 结合使用

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

将 Hibernate Envers 5.3 或更高版本与 Spring 5.1 之前的版本一起使用

在这种情况下,您需要使用 ThreadLocal 变量的传统方法,因为 Spring Framework 直到 5.1 才添加对将 Bean 注入(inject) Hibernate Bean 的支持。

关于java - 使用 Hibernate Envers 手动设置修订日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55871335/

相关文章:

java - 使用 Java 8 计算列表中的出现次数

java - Hibernate Search 不会根据 "calculated"值的更改重新索引

java - 如何将 JPA 默认抓取更改为 LAZY

java - 如何限制 Hibernate Envers 中的审计类型

hibernate-envers - 在 hibernate envers 中显示审计历史

c# - 这个基本 Java 方法的等效 C# 方法是什么?

java - RMI 内存不足异常

java - 在命令提示符中检查 java 版本时出错

java - 错误无法在 JPA 中找到名为 [total_recods] 的参数

java - hibernate 恩弗斯 : No delete entry in audit table for cascading deletes