spring boot 使用JPA @CreatedBy @LastModifiedBy 自动保存操作人
在实际开发中,经常需要为数据保存创建人、创建时间、修改人、修改时间这样的数据。使用JPA能轻松搞定这个问题,为数据自动加上这些信息。因为时间比较简单,只要加上@CreatedDate 和 @LastModifiedDate 就行了,主要记录下@CreatedBy @LastModifiedBy这两个注解。
添加注解
在实体类对应的属性上面添加注解,如:
示例代码:
@EntityListeners(AuditingEntityListener.class)
@Data
public class BaseEntity {
@Id
@Column(length = 36, columnDefinition = "varchar(36) COMMENT '主键'")
@GeneratedValue(generator="idGenerator")
@GenericGenerator(name="idGenerator", strategy = "org.eking.labor.core.utils.SnowflakeId")
private String uuid;
@CreatedDate
@Column(updatable = false, columnDefinition = "datetime COMMENT '创建时间'")
private Date createTime;
@LastModifiedDate
@Column(columnDefinition = "datetime COMMENT '更新时间'")
@JsonIgnore
private Date updateTime;
@Column(columnDefinition = "varchar(36) COMMENT '创建用户ID'")
@CreatedBy
@JsonIgnore
private String createUserUuid;
@Column(columnDefinition = "varchar(36) COMMENT '最后修改用户ID'")
@LastModifiedBy
@JsonIgnore
private String lastModifyUserUuid;
@Column(columnDefinition = "varchar(500) COMMENT '创建部门层级代码'")
@JsonIgnore
private String createDeptLevelCode;
}
实现AuditorAware类
需要实现org.springframework.data.domain.AuditorAware这个类,根据你需要返回的类型修改这个T,比如我需要返回的是字符串,就是String。需要注意的是,类需要加上@Component以便spring扫描到,否则不起作用。
示例代码:
@Component
@Slf4j
public class SpringSecurityAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
String userId = SecurityUtils.getCurrentUserId();
if (userId != null){
return Optional.of(userId);
} else {
return Optional.empty();
}
}
}
其中获取userId的方法是从spring security获取登录用户,这块就不赘述。
springboot 启动类加上注解@EnableJpaAuditing
加上注解后,会自动扫描到这个实现了AuditorAware的bean
@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
如果有多个实现,则会报错找到两个实现类
No qualifying bean of type ‘org.springframework.data.domain.AuditorAware<?>’ available: expected single matching bean but found 2: springSecurityAuditorAware,springSecurityAuditorAwareTest
这时,只需要在EnableJpaAuditing注解后增加参数说明需要使用哪个就可以
@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
至此,在添加和修改数据库数据的时候,会自动保存当前登录用户的ID到数据库中。