基于JPA如何處理數(shù)據(jù)表公共字段?
在軟件開發(fā)中,我們經(jīng)常需要跟蹤實體的歷史記錄,例如創(chuàng)建時間、修改時間等。Spring Data JPA 提供了一種名為 Auditing 的功能,可以自動處理這些操作。本文將介紹如何在 Spring Boot 項目中使用 Spring JPA Auditing。
實現(xiàn)方式
在實體類上添加注解;
- 定義通用實體,比如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相關(guān)注解;
// ...
@EntityListeners(AuditingEntityListener.class)
public class Domain implements Serializable {
// ...
}
- 添加自動填充屬性實現(xiàn),主要通過實現(xiàn)AuditorAware接口,并將實現(xiàn)注入到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
應(yīng)用示例
- 比如現(xiàn)在有一個User實體,我們通過繼承基類;
@Entity
@Table(name = "t_user")
@Data
public class User extends Domain {
@Id
private String id;
private String caption;
}
- 定義用戶對應(yīng)的Repository;
public interface UserRepository extends JpaRepository<User,String> {
}
- 用戶的創(chuàng)建與修改基于UserRepository來實現(xiàn);
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserRepository userRepository;
@PostMapping
public User saveUser(@RequestBody User user){
return userRepository.save(user);
}
}
- 服務(wù);
@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"
}
這樣每次調(diào)用用戶新增請求時,默認(rèn)會將DomainAuditorAware的返回值填充到@CreatedBy與@LastModifiedBy修飾的字段上去。
實現(xiàn)原理
可以看到,實現(xiàn)該效果狐妖有以下幾個關(guān)鍵點(diǎn):
- 實體需要添加@EntityListeners(AuditingEntityListener.class),并且需要再對應(yīng)字段上標(biāo)識出需要注入的操作人、操作時間等。
- 需要編寫自己的實現(xiàn)AuditorAware<String>,這里只用關(guān)注創(chuàng)建人,時間沒必要處理,當(dāng)然也可以通過實現(xiàn)接口DateTimeProvider來擴(kuò)展。
- 需要基于JpaRepository接口實現(xiàn)用戶的新增或修改。
- 需要@EnableJpaAuditing開啟。