JPA之@EnableJpaAuditing注解使用
@EnableJpaAuditing注解使用
在Spring JPA中,支持在字段或方法上進(jìn)行注解 @CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy。具體含義:
@CreateDate
:表示該字段是創(chuàng)建時(shí)間字段,在這個(gè)實(shí)體被insert的時(shí)候,會(huì)自動(dòng)填充創(chuàng)建的時(shí)間,不用手動(dòng)填充該字段。@CreatedBy
:表示該字段是創(chuàng)建人字段,在這個(gè)實(shí)體被insert的時(shí)候,會(huì)自動(dòng)填充創(chuàng)建人字段,不用手動(dòng)填充。@LastModifiedDate
、@LastModifiedBy
同理。
如何實(shí)現(xiàn)自動(dòng)填充功能,即如何使用審計(jì)?
1、在Xxx Application 啟動(dòng)類上添加 @EnableJpaAuditing:開(kāi)啟審計(jì)功能。
@EnableScheduling @EnableJpaAuditing //利用jpa可以給MySQL列屬性自動(dòng)賦值,例如一些創(chuàng)建時(shí)間,修改時(shí)間 @EnableEurekaClient @SpringBootApplication public class CouponTemplateApplication { public static void main(String[] args) { SpringApplication.run(CouponTemplateApplication.class, args); } /** * 測(cè)試中如果無(wú)法自動(dòng)識(shí)別,可能是包路徑的問(wèn)題,采用手動(dòng)聲明bean的方式 * @return */ @Bean public UserAuditor setUserAuditorAware(){ return new UserAuditor(); } }
2、實(shí)體類上添加 @EntityListeners(AuditingEntityListener.class):開(kāi)啟實(shí)體類監(jiān)聽(tīng)。
3、在需要的字段上加上 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 等注解。
@Data @NoArgsConstructor @AllArgsConstructor @Entity //實(shí)體類 @EntityListeners(AuditingEntityListener.class) //監(jiān)聽(tīng)器,自動(dòng)賦值創(chuàng)建時(shí)間 @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ù)表的一個(gè)列,相反的@Transient,表示該列不屬于數(shù)據(jù)表 private Integer id; /** 是否是可用狀態(tài) */ @Column(name = "available",nullable = false) private Boolean available; /** 是否過(guò)期 */ @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)建時(shí)間 * 使用@CreateDate注解在插入的時(shí)候,自動(dòng)生成創(chuàng)建時(shí)間,與監(jiān)聽(tīng)注解有關(guān) * */ @CreatedDate @Column(name = "create_time",nullable = false) private Date createTime; }
4、實(shí)現(xiàn) AuditorAware 接口來(lái)返回你需要插入的值。重點(diǎn)!
@Configuration @Slf4j public class UserAuditor implements AuditorAware<String> { /** * 獲取當(dāng)前創(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(審計(jì)功能)
Auditing功能簡(jiǎn)介
先貼上Spring Data JPA的官方文檔
項(xiàng)目中每條數(shù)據(jù)在創(chuàng)建修改的時(shí)候,我們都需要記錄它創(chuàng)建人,創(chuàng)建時(shí)間,修改人,修改時(shí)間。如果每次新增的時(shí)候都去手動(dòng)set,代碼冗余且顯得很不友好
spring data JPA 為我們提供了審計(jì)功能,英文是 Auditing
Auditing包括了四個(gè)注解,從名字就能看出它們的作用
@CreatedBy
:創(chuàng)建人,在這個(gè)實(shí)體被insert的時(shí)候,會(huì)設(shè)置值@LastModifiedBy
:最后一次修改人,在這個(gè)實(shí)體每次被更新的時(shí)候,會(huì)設(shè)置值@CreatedDate
:創(chuàng)建時(shí)間,在這個(gè)實(shí)體被insert的時(shí)候,會(huì)設(shè)置值@LastModifiedDate
:最后一次修改時(shí)間,在這個(gè)實(shí)體每次被更新的時(shí)候,會(huì)設(shè)置值
如何啟用
1.啟動(dòng)類上加@EnableJpaAuditing注解
2.實(shí)體類上加@EntityListeners(AuditingEntityListener.class)
3.屬性上面使用對(duì)應(yīng)注解
使用CreatedBy和LastModifiedBy時(shí)
JPA并不知道你的這個(gè)字段的值是什么,需要自己實(shí)現(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 則必須實(shí)現(xiàn)AuditorAware接口重寫getCurrentAuditor方法 * 在定義使用@CreatedBy或@LastModifiedBy時(shí),屬性類型必須與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(); } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
輸出java進(jìn)程的jstack信息示例分享 通過(guò)線程堆棧信息分析java線程
通過(guò)ps到j(luò)ava進(jìn)程號(hào)將進(jìn)程的jstack信息輸出。jstack信息是java進(jìn)程的線程堆棧信息,通過(guò)該信息可以分析java的線程阻塞等問(wèn)題。2014-01-01Java高級(jí)架構(gòu)之FastDFS分布式文件集群詳解
這篇文章主要介紹了Java高級(jí)架構(gòu)之FastDFS分布式文件集群詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04Java實(shí)現(xiàn)時(shí)間片輪轉(zhuǎn)調(diào)度算法的示例代碼
時(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡(jiǎn)單,最公平且使用最廣的算法,這篇文章主要為大家介紹了如何利用Java實(shí)現(xiàn)這一算法,需要的可以參考一下2023-07-07Spring Boot如何優(yōu)雅的使用多線程實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何優(yōu)雅的使用多線程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Mybatis-Plus主鍵插入null值報(bào)錯(cuò)問(wèn)題及解決
這篇文章主要介紹了Mybatis-Plus主鍵插入null值報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07使用IDEA和Gradle構(gòu)建Vertx項(xiàng)目(圖文步驟)
這篇文章主要介紹了使用IDEA和Gradle構(gòu)建Vertx項(xiàng)目(圖文步驟),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09