Java Hibernate环境-包括更改发生的日期
我们刚刚开始使用Hibernate Envers,它可以很好地记录更改的内容,但是,有没有一种方法可以在更改发生时记录更改 那么,它可以在审计表中添加datetime列吗 根据Envers文档,默认情况下应发生以下情况: 当Envers启动新修订时,它将创建一个新的修订图元,该图元存储有关修订的信息。默认情况下,这只包括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
- 修订号-整数值(int/Integer或long/long)。基本上是修订的主键
- 修订时间戳-long/long或java.util.Date值,表示进行修订的时刻。使用java.util.Date时,不要使用long/long作为修订时间戳,注意不要将其存储到会降低精度的列数据类型
谢谢您需要定义一个由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文档,修订时间戳应该是开箱即用的。