spring-data-JPA代码审计与乐观锁

代码审计

什么是代码审计:用于记录实体的创建者、修改者以及操作的对应时间的信息,这些功能在日志记录与数据版本管理中非常有用

阿里手册里要求非常详细,这些审计功能远远不足以满足(如果你和我看的是一门课你就知道我在说谁了)

不过这个功能还是比较强大的,毕竟JPA可以自动修改表,因此可以直接搓一个BaseEntity,里面写好序列化、唯一性的ID加上代码审计需要的四个字段,后续使用很方便

那么先写一下如何实现代码审计这个功能:

1.注入bean

@Configuration
public class UserAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of("");//这里需要放入当前操作的用户信息
}
}

2.在启动类添加注解

@EnableJpaAuditing

3.修改entity,加上类注解和字段注解

类注解为

@EntityListeners(AuditingEntityListener.class)

字段注解分别为

@CreatedBy
private String createdBy;
@CreatedDate
private Date createdDate;
@LastModifiedBy
private String lastModifiedBy;
@LastModifiedDate
private Date lastModifiedDate;

 

问题注意:

无法记录删除操作,删除后实体数据会被移除(不过这里可以用逻辑删除,加一个deleted字段,可能我后续会写一下),该功能需要spring-aspects.jar

 

乐观锁:

用于在并发时,利用CAS思想防止数据修改错乱导致的一些问题:每次修改行数据时,会为version修改。

@Version
private Long version;

在执行更新操作时,带有乐观锁的pojo会实现下面类似的sql语句:

UPDATE product SET name=?, price=?, version=? WHERE id=? AND version=?

 

整合一个BaseEntity:

@MappedSuperclass表示当前类不是一个完整的实体类,不会映射到数据库表中,但当前类的属性会映射到子类对应的数据库字段中,因此这个注解是和@Entity、@Table冲突的


@MappedSuperclass
@Getter
@Setter
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
protected Long id;
@CreatedBy
protected String createdBy;

@LastModifiedBy
protected String modifiedBy;

@CreatedDate
protected Date createdDate;

@LastModifiedDate
protected Date modifiedDate;

@Version
private Long version;
}
 

 

posted @ 2025-07-28 23:02  天启A  阅读(28)  评论(0)    收藏  举报