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;
}

浙公网安备 33010602011771号