JPA之@EnableJpaAuditing注解使用
@EnableJpaAuditing注解使用
在Spring JPA中,支持在字段或方法上進行注解 @CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy。具體含義:
@CreateDate:表示該字段是創(chuàng)建時間字段,在這個實體被insert的時候,會自動填充創(chuàng)建的時間,不用手動填充該字段。@CreatedBy:表示該字段是創(chuàng)建人字段,在這個實體被insert的時候,會自動填充創(chuàng)建人字段,不用手動填充。@LastModifiedDate、@LastModifiedBy同理。
如何實現(xiàn)自動填充功能,即如何使用審計?
1、在Xxx Application 啟動類上添加 @EnableJpaAuditing:開啟審計功能。
@EnableScheduling
@EnableJpaAuditing //利用jpa可以給MySQL列屬性自動賦值,例如一些創(chuàng)建時間,修改時間
@EnableEurekaClient
@SpringBootApplication
public class CouponTemplateApplication {
public static void main(String[] args) {
SpringApplication.run(CouponTemplateApplication.class, args);
}
/**
* 測試中如果無法自動識別,可能是包路徑的問題,采用手動聲明bean的方式
* @return
*/
@Bean
public UserAuditor setUserAuditorAware(){
return new UserAuditor();
}
}
2、實體類上添加 @EntityListeners(AuditingEntityListener.class):開啟實體類監(jiān)聽。
3、在需要的字段上加上 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 等注解。
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity //實體類
@EntityListeners(AuditingEntityListener.class) //監(jiān)聽器,自動賦值創(chuàng)建時間
@Table(name = "coupon_template")
@JsonSerialize(using = CouponTemplateSerialize.class) //綁定自定義的序列化器
public class CouponTemplate implements Serializable {
/** 自增主鍵 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id",nullable = false)
@Basic //指定屬于我們數(shù)據(jù)表的一個列,相反的@Transient,表示該列不屬于數(shù)據(jù)表
private Integer id;
/** 是否是可用狀態(tài) */
@Column(name = "available",nullable = false)
private Boolean available;
/** 是否過期 */
@Column(name = "expired",nullable = false)
private Boolean expired;
/** 優(yōu)惠券名稱 */
@Column(name = "name",nullable = false)
private String name;
/** 優(yōu)惠券 logo */
@Column(name = "logo",nullable = false)
private String logo;
/** 優(yōu)惠券描述 */
@Column(name = "intro",nullable = false)
private String desc;
/** 優(yōu)惠券模板 創(chuàng)建時間
* 使用@CreateDate注解在插入的時候,自動生成創(chuàng)建時間,與監(jiān)聽注解有關(guān)
* */
@CreatedDate
@Column(name = "create_time",nullable = false)
private Date createTime;
}
4、實現(xiàn) AuditorAware 接口來返回你需要插入的值。重點!
@Configuration
@Slf4j
public class UserAuditor implements AuditorAware<String> {
/**
* 獲取當前創(chuàng)建或修改的用戶
* @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();
}
}
}
Springboot啟用Spring Data JPA Auditing(審計功能)
Auditing功能簡介
先貼上Spring Data JPA的官方文檔
項目中每條數(shù)據(jù)在創(chuàng)建修改的時候,我們都需要記錄它創(chuàng)建人,創(chuàng)建時間,修改人,修改時間。如果每次新增的時候都去手動set,代碼冗余且顯得很不友好
spring data JPA 為我們提供了審計功能,英文是 Auditing

Auditing包括了四個注解,從名字就能看出它們的作用
@CreatedBy:創(chuàng)建人,在這個實體被insert的時候,會設(shè)置值@LastModifiedBy:最后一次修改人,在這個實體每次被更新的時候,會設(shè)置值@CreatedDate:創(chuàng)建時間,在這個實體被insert的時候,會設(shè)置值@LastModifiedDate:最后一次修改時間,在這個實體每次被更新的時候,會設(shè)置值
如何啟用
1.啟動類上加@EnableJpaAuditing注解

2.實體類上加@EntityListeners(AuditingEntityListener.class)

3.屬性上面使用對應(yīng)注解

使用CreatedBy和LastModifiedBy時
JPA并不知道你的這個字段的值是什么,需要自己實現(xiàn)AuditorAware接口
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Optional;
/**
* 使用@CreatedBy或@LastModifiedBy 則必須實現(xiàn)AuditorAware接口重寫getCurrentAuditor方法
* 在定義使用@CreatedBy或@LastModifiedBy時,屬性類型必須與AuditorAware接口的泛型類型相同
*/
@Configuration
public class SpringSecurityAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
UserDetails userDetails;
try {
userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return Optional.ofNullable(userDetails.getUsername());
}catch (Exception e){
return Optional.empty();
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
輸出java進程的jstack信息示例分享 通過線程堆棧信息分析java線程
通過ps到j(luò)ava進程號將進程的jstack信息輸出。jstack信息是java進程的線程堆棧信息,通過該信息可以分析java的線程阻塞等問題。2014-01-01
Java高級架構(gòu)之FastDFS分布式文件集群詳解
這篇文章主要介紹了Java高級架構(gòu)之FastDFS分布式文件集群詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
Java實現(xiàn)時間片輪轉(zhuǎn)調(diào)度算法的示例代碼
時間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡單,最公平且使用最廣的算法,這篇文章主要為大家介紹了如何利用Java實現(xiàn)這一算法,需要的可以參考一下2023-07-07
Spring Boot如何優(yōu)雅的使用多線程實例詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何優(yōu)雅的使用多線程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
使用IDEA和Gradle構(gòu)建Vertx項目(圖文步驟)
這篇文章主要介紹了使用IDEA和Gradle構(gòu)建Vertx項目(圖文步驟),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09

