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

Hibernate Envers-包括更改发生的日期

司空叶五
2023-03-14

我们刚刚开始使用Hibernate Envers,它可以很好地记录更改的内容,但是,有没有一种方法可以在更改发生时记录?

那么,它能否向audit表中添加一个datetime列呢?

根据Envers文档,默认情况下应该发生以下情况:

当Envers启动新的修订时,它会创建一个新的修订实体,该实体存储有关修订的信息。默认情况下,这只包括

    null

谢谢

共有1个答案

贝研
2023-03-14

您需要定义一个供Envers使用的自定义RevisionEntity,以便可以添加所需的属性。需要对您假装用作自定义修订实体的类进行注释:

@RevisionEntity(AuditingRevisionListener.Class)

在这个实体中,您可以定义您需要的内容。例如,这应该是一个很好的起点:

@Entity
@Table(name = "DATA_REVIEW_TABLE")
@RevisionEntity(AuditingRevisionListener.class)
public class AuditedRevisionEntity {
  @RevisionNumber
  @Id
  @SequenceGenerator(name = "revisionSeq", sequenceName = "REVISION_DATOS_ID_SEQ", allocationSize = 1, initialValue = 1)
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "revisionSeq")
  private int id;

  @RevisionTimestamp
  private Date modifiedAt;
  private String username;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  @Temporal(value = TemporalType.TIMESTAMP)
  public Date getModifiedAt() {
    return modifiedAt;
  }

  public void setModifiedAt(Date modifiedAt) {
    this.modifiedAt = modifiedAt;
  }

}

此外,还必须定义修订侦听器,以处理如何在自定义修订实体中初始化数据。您的侦听器必须实现RevisionListener。

public class AuditingRevisionListener implements RevisionListener {
  private static Log log = LogFactory.getLog(AuditingRevisionListener.class.getName());

  @Override
  public void newRevision(Object revisionEntity) {
    AuditedRevisionEntity revEntity = (AuditedRevisionEntity) revisionEntity;
    String userName = null;
    try {
      if (SecurityContextHolder.getContext().getAuthentication() != null) {
        Object principal = getCurrentUserInfo();
        if (principal == null) {
          userName = "system";
        } else if (principal instanceof User) {
          userName = ((User) principal).getUsername();
        } 
      }
    } catch (Exception e) {
      log.error("Error auditing username.", e);
    }
    revEntity.setUsername(userName);
    revEntity.setModifiedAt(new Date());
  }
}

请记住这些类必须可由hibernate访问,检查以下内容:为什么hibernate Envers忽略我的自定义RevisionEntity?

 类似资料:
  • 根据要求,我的代码应该将ZonedDateTime参数中的日期和OffSetTime参数中的时间附加到格式“yyyy-MM-dd-HH:MM:ss.SSSz”中。然而,我没能做到这一点 我用DateTimeFormatter尝试了各种方法,包括下面的方法。 我注意到:-代码在LocalDateTime抛出“java.time.DateTimeException:无法提取值:class java.t

  • 问题内容: 当使用日志包时,Go输出类似 如何将日期和时间格式更改为类似的格式?示例(操场链接): 问题答案: 就像yed posterior所说,您可以通过实现write函数来定义自定义io.Writer。您可能还想做一个log.SetFlags(0)来完全控制。这是一个更改日期格式以及添加一些日志级别信息的示例。 输出: 2016-03-21T19:54:28.563Z [DEBUG]这已被记

  • 问题内容: 如何获得两个工作日之间的工作天数,即不包括周末和节假日?假期是指法律认可的假期。由于每个国家/地区的假期不同,因此必须取决于国家/地区。 例如,由于介于两者之间的周末,应返回而不是。 我已经看过Jollyday和ObjectLab- Kit ,但是我不能让它们满足我的需要。我的意思是,他们两个都有很多有趣的方法,但是找不到类似…的东西。 问题答案: 最后是基于API 的解决方案: 致电

  • 问题内容: 现在,我的构建过程使用MS Build从源进行构建,并在构建过程中执行自定义程序。我在程序中写入控制台的所有内容都记录在控制台输出中。 但是,我也想在用户界面的“更改”和/或“状态”部分中记录一些条目(类似于SVN所做的事情)。 如何才能做到这一点? 问题答案: // This is a deliciously convoluted and fragile hack to force

  • 问题内容: 我需要计算两个日期之间的营业日。例如:我们7月4日放假。所以如果我的日期是date1 = 07/03/2012 date2 = 07/06/2012 由于7月4日为节假日,因此,这些日期的黑白工作日应该为1。 我有一种下面的方法来计算工作日,该工作日仅计算周末,而不计算假期。还有什么方法可以计算假期吗....请帮我。 问题答案: 假设您有一个包含所有假期的列表。 只需在您的条件中添加条

  • 当node_module库导入索引文件时,webpack为什么不在构建中包含这些库? webpack对我来说仍然是一种黑色的艺术,我还没有完全掌握,所以下面是我试图实现的一个解释。 我正在构建一个测试应用程序,以在AWS Lambda节点服务器上作为无服务器代码运行。目标是通过在服务器上有一个或多个块并且没有node_modules文件夹,使部署包尽可能小。 我正在用TypescriptV3编写文