但是,如果您实施自己的解决方案,这是可能的。我对审计日志业务需求也有同样的需求,所以设计了自己的 AuditField 注释,并应用于要审计日志的字段。
这是一个实体 bean 中的示例 - 站点。
@AuditField(exclude={EntityActionType.DELETE})
@Column(name = "site_code", nullable = false)
private String siteCode;
因此,该示例表明“siteCode”是审核日志的字段,但 DELETE 操作除外。(EntityActionType 是一个枚举,它包含 CRUD 操作。)
此外,EntityListener 也有这部分代码。
@PostPersist
public void created(Site pEntity) {
log(pEntity, EntityActionType.CREATE);
}
@PreUpdate
public void updated(Site pEntity) {
log(pEntity, EntityActionType.UPDATE);
}
@PreRemove
public void deleted(Site pEntity) {
log(pEntity, EntityActionType.DELETE);
}
现在它在 log() 中要做的是,弄清楚哪些字段是审计日志以及可选地涉及哪些自定义操作。
但是,还有另一个需要考虑。如果将注释放在另一个实体变量中,则必须记录实体的哪些字段?(即链式日志记录)
您可以选择仅在实体中使用 @AuditField 注释的内容还是其他方式。就我而言,我们决定只记录实体 ID,它是数据库表的 PK。但是,假设业务可以改变,我想使其灵活。因此,所有实体都必须实现 auditValue() 方法,该方法来自基实体类,并且默认实现(可覆盖)是返回其 ID。