Java Hibernate环境-包括更改发生的日期

Java Hibernate环境-包括更改发生的日期,java,hibernate,jpa,hibernate-envers,Java,Hibernate,Jpa,Hibernate Envers,我们刚刚开始使用Hibernate Envers,它可以很好地记录更改的内容,但是,有没有一种方法可以在更改发生时记录更改 那么,它可以在审计表中添加datetime列吗 根据Envers文档,默认情况下应发生以下情况: 当Envers启动新修订时,它将创建一个新的修订图元,该图元存储有关修订的信息。默认情况下,这只包括 修订号-整数值(int/Integer或long/long)。基本上是修订的主键 修订时间戳-long/long或java.util.Date值,表示进行修订的时刻。使用ja

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

那么,它可以在审计表中添加datetime列吗

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

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

  • 修订号-整数值(int/Integer或long/long)。基本上是修订的主键
  • 修订时间戳-long/long或java.util.Date值,表示进行修订的时刻。使用java.util.Date时,不要使用long/long作为修订时间戳,注意不要将其存储到会降低精度的列数据类型
因此,我的理解是,获取修订时间戳不需要任何必需的操作。但是,在我的例子中,envers创建的表中没有修订时间戳


谢谢

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

@修订实体(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访问,请选中此项:

有一个由envers自动创建的表,名为:REVINFO,其中包含时间戳

它包含REV,作为“\u AUD”表中的修订编号。 此编号在所有“\u AUD”表格之间是唯一的

见第15.8段。了解中的Envers模式 这对我很有效:

select

    to_char(

                TO_DATE('01/01/1970 00:00:00','DD/MM/YYYY HH24:MI:SS')

                + (rev.timestamp /1000/60/60/24 ||' day')::interval, 'YYYY/MM/DD'

        )

from audit_table_aud aud

join revisions as rev on aud.rev = rev.id

阅读手册?谢谢Alan,根据文档,Evners默认添加了一个修订时间戳。但是,就我而言,这并没有显示出来。谢谢@Ricardo,这非常有用。但是我不明白为什么我需要这样做,因为根据Envers文档,修订时间戳应该是开箱即用的。