Mag*_*ick 6 java hibernate jpa hibernate-envers
我们刚刚开始使用 Hibernate Envers,它可以很好地记录更改的内容,但是,有没有一种方法可以在更改发生时记录它?
那么,它可以在审计表中添加日期时间列吗?
根据 Envers 文档,默认情况下应该发生这种情况:
当 Envers 开始新的修订时,它会创建一个新的修订实体,用于存储有关修订的信息。默认情况下,这仅包括
- 修订号 - 整数值(int/Integer 或 long/Long)。本质上是修订的主键
- 修订时间戳 - 表示修订发生时刻的 long/Long 或 java.util.Date 值。当使用 java.util.Date 而不是 long/Long 作为修订时间戳时,请注意不要将其存储到会丢失精度的列数据类型。
因此,我的理解是,无需执行任何操作即可获取修订时间戳。但是,就我而言,envers 创建的表中没有修订时间戳。
谢谢
小智 6
有一个由 envers 自动创建的表,名为:REVINFO,其中包含时间戳。
它包含REV作为键,它是“ _AUD ”表中的修订号。该数字在所有“ _AUD ”表中都是唯一的。
参见第15.8 段。了解https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch15.html中的 Envers 架构
您需要定义一个供 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;
}
}
Run Code Online (Sandbox Code Playgroud)
此外,您还必须定义修订侦听器来处理自定义修订实体中数据的初始化方式。您的侦听器必须实现 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());
}
}
Run Code Online (Sandbox Code Playgroud)
请记住,这些类必须可由 hibernate 访问,请检查以下内容:Why Hibernate Envers is ignoring my custom RevisionEntity?
| 归档时间: |
|
| 查看次数: |
11862 次 |
| 最近记录: |