在软件开发中,我们经常需要跟踪实体的历史记录,例如创建时间、修改时间等。Spring Data JPA 提供了一种名为 Auditing 的功能,可以自动处理这些操作。本文将介绍如何在 Spring Boot 项目中使用 Spring JPA Auditing。
实现方式
在实体类上添加注解;
- 定义通用实体,比如Domain类,我们会将通用字段在这里定义
@MappedSuperclass
@Data
public class Domain implements Serializable {
@CreatedBy
@Column(name = "creator", length = 56)
private String creator;
@CreatedDate
@Column(name = "create_time", length = 12)
private Date createTime;
@LastModifiedBy
@Column(name = "modifier", length = 56)
private String modifier;
@LastModifiedDate
@Column(name = "modified_time", length = 12)
private Date modifiedTime;
}
- 添加Auditing相关注解;
// ...
@EntityListeners(AuditingEntityListener.class)
public class Domain implements Serializable {
// ...
}
- 添加自动填充属性实现,主要通过实现AuditorAware接口,并将实现注入到spring容器;
public class DomainAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of("我是操作人");
}
}
- 定义spring自动配置;
@Configuration
public class JpaAuditingConfiguration {
@Bean
public DomainAuditorAware domainAuditorAware(){
return new DomainAuditorAware();
}
}
在resource目录添加自动注入配置META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,这样通过引入jar就可以自动使用该配置。
cn.cycad.jpa.auditing.config.JpaAuditingConfiguration
应用示例
- 比如现在有一个User实体,我们通过继承基类;
@Entity
@Table(name = "t_user")
@Data
public class User extends Domain {
@Id
private String id;
private String caption;
}
- 定义用户对应的Repository;
public interface UserRepository extends JpaRepository<User,String> {
}
- 用户的创建与修改基于UserRepository来实现;
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserRepository userRepository;
@PostMapping
public User saveUser(@RequestBody User user){
return userRepository.save(user);
}
}
- 服务;
@EnableJpaAuditing
@EntityScan({"cn.cycad.jpa.auditing.sample.entity"})
@EnableJpaRepositories(basePackages="cn.cycad.jpa.auditing.sample.repository")
@SpringBootApplication
public class SampleApplication{
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
通过注解@EnableJpaAuditing启用。
- 编写测试用例;
### 新增用户
POST http://localhost:8080/user
Content-Type: application/json
{
"id": "1",
"caption": "tom"
}
这样每次调用用户新增请求时,默认会将DomainAuditorAware的返回值填充到@CreatedBy与@LastModifiedBy修饰的字段上去。
实现原理
可以看到,实现该效果狐妖有以下几个关键点:
- 实体需要添加@EntityListeners(AuditingEntityListener.class),并且需要再对应字段上标识出需要注入的操作人、操作时间等。
- 需要编写自己的实现AuditorAware<String>,这里只用关注创建人,时间没必要处理,当然也可以通过实现接口DateTimeProvider来扩展。
- 需要基于JpaRepository接口实现用户的新增或修改。
- 需要@EnableJpaAuditing开启。