当前位置: 首页 > 知识库问答 >
问题:

使用Hibernate版本手动设置修订日期

缪风史
2023-03-14

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

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

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

共有1个答案

欧阳洲
2023-03-14

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

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

  1. <code>@RevisionTimestamp</code>带注释的属性设置为当前时间
  2. 调用可选的RevisionListener并将其提供给修订实体实例

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

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

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

在这种情况下,您需要为hibernate添加一个额外的引导配置属性,可以通过< code > 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 的值,则需要确定以下哪项适用于您:

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

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

您可以使用Spring的注入注释将Spring bean直接注入侦听器,就像侦听器是一个Spring bean一样。

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

 类似资料:
  • 我已经开始使用Hibernate Envers来审计日志业务对象。我已经阅读了文档,从我看到的所有例子来看,查询都是通过修订号来完成的。 我想按修改日期查询,即获取在特定日期或日期范围内发生的被审计实体的所有行。这种事情可能吗? 我的 revinfo 表保存一个时间戳,所以我知道数据在那里。

  • 问题内容: 我有两个类,例如,使用Hibernate(3.6.1最终版)和JPA(2.0)将Foo和Bar映射为@OneToOne(双向),例如- 请注意-Bar和Qux没有列 如果我们更新Bar,则hibernate将不会增加Foo的版本,而Qux则不会相同。但是我们的业务逻辑需要- 如果有人在Foo中更新Bar,而其他线程正在尝试更新同一Foo的Qux,但没有更新Bar,反之亦然,则此类更新将

  • Git 允许你通过几种方法来指明特定的或者一定范围内的提交。 了解它们并不是必需的,但是了解一下总没坏处。 单个修订版本 你可以通过 Git 给出的 SHA-1 值来获取一次提交,不过还有很多更人性化的方式来做同样的事情。 本节将会介绍获取单个提交的多种方法。 简短的 SHA-1 Git 十分智能,你只需要提供 SHA-1 的前几个字符就可以获得对应的那次提交,当然你提供的 SHA-1 字符数量不

  • 我们正在将一个应用程序从JEE7迁移到JEE8。此应用程序依赖于Hibernate ORM和Hibernate Envers。在JEE7上是版本5.2.17,在JEE8上,现在两个自由党的版本都是5.4.3。我们有一个自定义修订实体,它通过实现RevisionListener添加用户信息来扩展DefaultRevisionEntity。在JEE7上,它在OpenLiberty 19.0.0.5上运

  • Peg和实施修订版本 文件和目录的拷贝、改名和移动能力使你可以创建一个项目,然后删除它,然后在同一个位置添加一个新的—这是在我们的计算机中经常发生的操作,而你的版本控制系统不应该成为你这样操作的障碍。Subversion的文件管理操作是这样的开放,提供了几乎和普通文件一样的操作版本化文件的灵活性,但是灵活意味着在整个版本库的生命周期中,一个给定的版本化的资源可能会出现在许多不同的路径,一个给定的路

  • 问题内容: 我想使用Java JGit库来检索先前提交的文件修订。该文件每天都会更新,我需要从git存储库访问以前的版本。 我知道如何通过提供提交的修订我需要哈希,如所描述检出一个特定的修订版本在这里用这个命令: 当前,我克隆存储库,搜索该文件的最新提交,然后签出修订版。我现在的过程很麻烦,因为我每次都需要重新检出存储库。我宁愿只是从特定修订版(例如,master分支)中导出单个文件。 修订日志