SpringData JPA审计字段的使用
往期文章
审计字段
系统的数据表中一般会记录固定的字段以记录数据的元数据,例如:ID、创建人、创建时间、修改人、修改时间、逻辑删除、版本号等
Spring Data提供了对应的注解:@Id、@CreatedBy(创建人)、@CreatedDate(创建时间)、@LastModifiedBy(修改人)、@LastModifiedDate(修改时间)、@Version(版本号)
需要添加的依赖
<!--Spring aspect Auditor审计功能需要-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
步骤
1. 启动类添加注解:@EnableJpaAuditing
2. 创建一个组件,实现AuditorAware
接口
为创建人、修改人字段赋值(如果是做了登录模块的可以使用Session)
@Component
public class EvadAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
// 该值将在执行insert或update语句时赋值给创建人和修改人字段
// 如果有权限模块就可以通过权限上下文对象获取用户信息,再赋值了
return Optional.of("Evad");
}
}
3. 创建一个审计字段的抽象类,其他数据表映射类可以继承它
/**
* @author Evad.Wu
* @Description 基础审计属性
* @date 2022-07-10
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@ApiModel(value = "基础审计属性")
public abstract class BasePo implements Serializable {
@Serial
private static final long serialVersionUID = -8496736827518774172L;
@Id
@Column(name = "ID", columnDefinition = "BIGINT(20) COMMENT '主键'")
private Long id;
@CreatedBy
@Column(name = "CREATOR", updatable = false, columnDefinition = "VARCHAR(64) COMMENT '创建人'")
private String creator;
@CreatedDate
@Column(name = "CREATE_TIME", columnDefinition = "DATETIME COMMENT '创建时间'", updatable = false)
private Date createTime;
@LastModifiedBy
@Column(name = "MODIFIER", updatable = false, columnDefinition = "VARCHAR(64) COMMENT '修改人'")
private String modifier;
@LastModifiedDate
@Column(name = "MODIFY_TIME", columnDefinition = "DATETIME COMMENT '修改时间'")
private Date modifyTime;
@Column(name = "LOGIC_DEL", columnDefinition = "TINYINT DEFAULT 0 COMMENT '逻辑删除'")
private Boolean logicDel;
@Version
@Column(name = "REC_VER", columnDefinition = "BIGINT(20) DEFAULT 1 COMMENT '版本号'")
private Long recVer = 1L;
}
4. @EntityListeners
审计监听注解与实现类
@EntityListeners(AuditingEntityListener.class) // 审计功能
源码解释:
JPA实体监听器,用于捕获关于发布(Insert)和更新(update)实体的审计信息。
5. @MappedSuperclass
给父类添加这个注解后,父类中的审计字段就不会被视为独立的表了。
源码解释:
指定一个类,其映射信息应用于从该类继承的实体。映射的超类没有为其定义单独的表。
6. 创建一个数据库映射类,继承审计字段的父类
@Setter
@Getter
@NoArgsConstructor
@Accessors(chain = true)
@TableName(value = "SYS_USER_AGENT")
@Entity
@Table(name = "SYS_USER_AGENT")
@DynamicInsert
@EntityListeners(AuditingEntityListener.class)
public class SysUserAgent extends BasePo {
@Serial
private static final long serialVersionUID = -725432336951066705L;
/**
* User-Agent
*/
@TableField(value = "USER_AGENT")
@Column(name = "USER_AGENT", columnDefinition = "varchar(512) NOT NULL COMMENT 'user-agent'")
private String userAgent;
}
7. 对应的数据库建表语句
CREATE TABLE `SYS_USER_AGENT` (
`ID` bigint(20) NOT NULL COMMENT '主键',
`CREATOR` varchar(64) NOT NULL COMMENT '创建人',
`CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
`MODIFIER` varchar(64) NOT NULL COMMENT '修改人',
`MODIFY_TIME` datetime NOT NULL COMMENT '修改时间',
`LOGIC_DEL` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
`REC_VER` bigint(20) NOT NULL COMMENT '版本号',
`USER_AGENT` varchar(512) NOT NULL COMMENT 'user-agent',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Header常用User-Agent信息表';