基于JPA如何处理数据表公共字段?

开发 前端
实体需要添加@EntityListeners(AuditingEntityListener.class),并且需要再对应字段上标识出需要注入的操作人、操作时间等。

在软件开发中,我们经常需要跟踪实体的历史记录,例如创建时间、修改时间等。Spring Data JPA 提供了一种名为 Auditing 的功能,可以自动处理这些操作。本文将介绍如何在 Spring Boot 项目中使用 Spring JPA Auditing。

实现方式

在实体类上添加注解;

  1. 定义通用实体,比如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;

}
  1. 添加Auditing相关注解;
// ...
@EntityListeners(AuditingEntityListener.class)
public class Domain implements Serializable {
    // ...
}
  1. 添加自动填充属性实现,主要通过实现AuditorAware接口,并将实现注入到spring容器;
public class DomainAuditorAware implements AuditorAware<String> {
    @Override
    public Optional<String> getCurrentAuditor() {
        return Optional.of("我是操作人");
    }
}
  1. 定义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

应用示例

  1. 比如现在有一个User实体,我们通过继承基类;
@Entity
@Table(name = "t_user")
@Data
public class User extends Domain {

    @Id
    private String id;

    private String caption;

}
  1. 定义用户对应的Repository;
public interface UserRepository extends JpaRepository<User,String> {
    
}
  1. 用户的创建与修改基于UserRepository来实现;
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserRepository userRepository;
    
    @PostMapping
    public User saveUser(@RequestBody User user){
        return userRepository.save(user);
    }

}
  1. 服务;
@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启用。

  1. 编写测试用例;
### 新增用户
POST http://localhost:8080/user
Content-Type: application/json

{
  "id": "1",
  "caption": "tom"
}

这样每次调用用户新增请求时,默认会将DomainAuditorAware的返回值填充到@CreatedBy与@LastModifiedBy修饰的字段上去。

实现原理

可以看到,实现该效果狐妖有以下几个关键点:

  1. 实体需要添加@EntityListeners(AuditingEntityListener.class),并且需要再对应字段上标识出需要注入的操作人、操作时间等。
  2. 需要编写自己的实现AuditorAware<String>,这里只用关注创建人,时间没必要处理,当然也可以通过实现接口DateTimeProvider来扩展。
  3. 需要基于JpaRepository接口实现用户的新增或修改。
  4. 需要@EnableJpaAuditing开启。
责任编辑:武晓燕 来源: Java技术指北
相关推荐

2024-08-29 08:58:30

JPA编写数据操

2024-10-16 17:04:13

2010-05-18 17:17:02

MySQL数据表

2019-08-15 10:20:19

云计算技术安全

2021-01-26 13:40:44

mysql数据库

2021-08-11 16:57:03

数据中心光纤布线电缆管理

2013-06-04 09:16:29

Google存储数据

2010-06-09 18:14:02

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux内核

2017-03-13 13:21:34

Git处理大仓库

2017-10-26 08:43:18

JavaScript内存处理

2021-03-01 07:31:53

消息支付高可用

2019-12-23 10:20:12

Web图片优化前端

2010-11-23 16:04:40

MySQL数据表

2009-09-07 16:13:14

LINQ to SQL

2019-02-25 08:35:22

机器学习数据模型

2010-11-22 13:53:46

MySQL数据表

2024-08-26 10:47:22

2022-04-19 09:00:52

ReactTypeScript
点赞
收藏

51CTO技术栈公众号