【Spring Data JPA 系列】08、乐观锁与审计

2,079 阅读1分钟

8、乐观锁

乐观锁是属于hibernate!

防止并发修改!

 private @Version Long version;

9、审计

如何使用审计功能

首先申明实体类,需要在类上加上注解@EntityListeners(AuditingEntityListener.class),其次在application启动类上添加注解@EnableJpaAuditing,同时在需要的字段上添加@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy等注解。

这个时候,在 Jpa.save()方法被调用的时候,时间字段会自动设置并插入数据库,但是CreatedBy和LastModifiedBy并没有赋值,因为需要实现AuditorAware接口来返回你需要插入的值。

1、编写AuditorAware

 import org.springframework.data.domain.AuditorAware;
 import java.util.Optional;
 
 /**
  * 监听
  * @CreatedBy
  * @LastModifiedBy
  * 自动注入用户名
  */
 public class AuditorAwareConfig implements AuditorAware<String> {
     @Override
     public Optional<String> getCurrentAuditor() {
         return Optional.empty();
     }
 }
 
 ----------------------------------------------
 
 /**
  * 这是JavaConfig方式!
  * AuditorAware 返回当前用户
  * @return
  */
 @Bean
 public AuditorAware<String> auditorAware() {
     return new AuditorAware<String>() {
         @Override
         public Optional getCurrentAuditor() {
             // 当前用户 session  redis  springsecurity
             return Optional.of("yykk");
         }
     };
 }

2、在实体类上声明@EntityListeners和响应的注解

考虑到所有实体都要声明,都写在 BaseEntityModel 中

 package com.yykk.config;
 
 import lombok.Data;
 import org.springframework.data.annotation.CreatedBy;
 import org.springframework.data.annotation.CreatedDate;
 import org.springframework.data.annotation.LastModifiedBy;
 import org.springframework.data.annotation.LastModifiedDate;
 import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
 import javax.persistence.EntityListeners;
 import javax.persistence.MappedSuperclass;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import java.io.Serializable;
 import java.util.Date;
 
 @MappedSuperclass
 @EntityListeners(AuditingEntityListener.class)
 @Data
 public class BaseEntityModel implements Serializable {
 
     private static final long serialVersionUID  = -6163675075289529459L;
 
     @CreatedBy
     String createdBy;
 
     @LastModifiedBy
     String modifiedBy;
 
     @Temporal(TemporalType.TIMESTAMP)
     @CreatedDate
     protected
     Date dateCreated = new Date();
 
     @Temporal(TemporalType.TIMESTAMP)
     @LastModifiedDate
     protected
     Date dateModified = new Date();
 }

3、在Application中启用审计@EnableJpaAuditing

 @EnableJpaAuditing

如果要进行使用的话,需要导入aop的依赖,虽然有aop但是报错没有aspects,添加如下:

 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-aspects</artifactId>
     <version>5.3.15</version>
 </dependency>

经过测试如果你的实体类上面的多个字段使用了@CreatedBy这样的注解,只会有一个生效,也就是说在一次请求中,只会被调用一次!