關於自動填充或更新實體中的 CreateDate、CreatedBy 等在以前有一篇 jeecg 默認爲空的字段值是如何被填充的? 有提到經過攔截器的方式實現,可是今天帶你們瞭解一下若是使用 JPA 的審計功能是如何簡單實現該操做的。html
在 Spring JPA 中,支持在字段或者方法上進行註解 @CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedByjava
@CreateDate
表示該字段爲建立時間時間字段,在這個實體被 insert 的時候,會設置默認值微信
@CreatedBy
表示該字段爲建立人,在這個實體被insert的時候,會設置值。app
@LastModifiedDate、@LastModifiedBy同理。ide
附一張項目中的使用圖:測試
難道就像上方圖片顯示的,只須要加上註解就能夠了嗎?spa
顯然是否認的。code
實體類上添加 @EntityListeners(AuditingEntityListener.class)orm
在須要的字段上加上 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 等註解。htm
在Xxx Application 啓動類上添加 @EnableJpaAuditing
實現 AuditorAware 接口來返回你須要插入的值。重點!
以下是一個基類的代碼,實現了 一、2 步:
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@ApiModelProperty(value = "惟一標識")
private String id;
@CreatedBy
private String createBy;
@CreatedDate
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "建立時間")
private Date createTime;
@ApiModelProperty(value = "更新者")
@LastModifiedBy
private String updateBy;
@LastModifiedDate
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新時間")
private Date updateTime;
}
第3步,啓動類上增長註釋:
@SpringBootApplication
@EnableJpaAuditing
public class TmaxApplication {
public static void main(String[] args) {
SpringApplication.run(TmaxApplication.class, args);
}
/**
* 測試中若是沒法自動識別,多是包路徑的問題,採用手動聲明bean的方式
* @return
*/
@Bean
public UserAuditor setUserAuditorAware(){
return new UserAuditor();
}
}
通過測試若是你的實體類上面的多個字段使用了 @CreatedBy 這樣的註解,只會有一個生效,也就是說在一次請求中,只會被調用一次
來看第4步,也是最重要的一步:
@Configuration
@Slf4j
public class UserAuditor implements AuditorAware<String> {
/**
* 獲取當前建立或修改的用戶
* @return
*/
@Override
public Optional<String> getCurrentAuditor() {
UserDetails user;
try {
user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return Optional.ofNullable(user.getUsername());
}catch (Exception e){
return Optional.empty();
}
}
}
關於方法 getCurrentAuditor 中獲取用戶名的操做可根據本身實際狀況書寫,好比上方我用到的是 Spring Secirity 的一種寫法。
若是文章有錯的地方歡迎指正,你們互相留言交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:niceyoo