有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

When Envers starts a new revision, it creates a new revision entity which stores information about the revision. By default, that includes just

  • revision number - An integral value (int/Integer or long/Long). Essentially the primary key of the revision
  • revision timestamp - either a long/Long or java.util.Date value representing the instant at which the revision was made. When using a java.util.Date, instead of a long/Long for the revision timestamp, take care not to store it to a column data type which will loose precision.

因此,我的理解是,获取修订时间戳不需要任何必需的操作。但是,在我的例子中,envers创建的表中没有修订时间戳

谢谢


共 (3) 个答案

  1. # 2 楼答案

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

    @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访问,请选中此项:Why Hibernate Envers is ignoring my custom RevisionEntity?

  2. # 3 楼答案

    这对我很有用:

    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