JPA之@EnableJpaAuditing注解使用
@EnableJpaAuditing注解使用
在Spring JPA中,支持在字段或方法上進(jìn)行注解 @CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy。具體含義:
@CreateDate:表示該字段是創(chuàng)建時間字段,在這個實(shí)體被insert的時候,會自動填充創(chuàng)建的時間,不用手動填充該字段。@CreatedBy:表示該字段是創(chuàng)建人字段,在這個實(shí)體被insert的時候,會自動填充創(chuàng)建人字段,不用手動填充。@LastModifiedDate、@LastModifiedBy同理。
如何實(shí)現(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、實(shí)體類上添加 @EntityListeners(AuditingEntityListener.class):開啟實(shí)體類監(jiān)聽。
3、在需要的字段上加上 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 等注解。
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity //實(shí)體類
@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、實(shí)現(xiàn) AuditorAware 接口來返回你需要插入的值。重點(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(審計功能)
Auditing功能簡介
先貼上Spring Data JPA的官方文檔
項(xiàng)目中每條數(shù)據(jù)在創(chuàng)建修改的時候,我們都需要記錄它創(chuàng)建人,創(chuàng)建時間,修改人,修改時間。如果每次新增的時候都去手動set,代碼冗余且顯得很不友好
spring data JPA 為我們提供了審計功能,英文是 Auditing

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

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

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

使用CreatedBy和LastModifiedBy時
JPA并不知道你的這個字段的值是什么,需要自己實(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時,屬性類型必須與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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java Springboot實(shí)現(xiàn)多文件上傳功能
這篇文章主要為大家詳細(xì)介紹了java Springboot實(shí)現(xiàn)多文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08
Spring?Security?登錄時添加圖形驗(yàn)證碼實(shí)現(xiàn)實(shí)例
這篇文章主要為大家介紹了Spring?Security?登錄時添加圖形驗(yàn)證碼實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
spring-boot使用Admin監(jiān)控應(yīng)用的方法
本篇文章主要介紹了spring-boot使用Admin監(jiān)控應(yīng)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
淺談java Iterator.remove()方法的用法(詳解)
下面小編就為大家?guī)硪黄獪\談java Iterator.remove()方法的用法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解
這篇文章主要介紹了Netty之使用DelimiterBasedFrameDecoder進(jìn)行消息分隔詳解,在使用Netty進(jìn)行TCP消息傳輸時,為了上層協(xié)議能夠?qū)ο⒄_區(qū)分,避免粘包和拆包導(dǎo)致的問題,一般可以通過消息定長、將回車換行符作為消息結(jié)束符,需要的朋友可以參考下2023-12-12
JAVA進(jìn)階之HashMap底層實(shí)現(xiàn)解析
Hashmap是java面試中經(jīng)常遇到的面試題,大部分都會問其底層原理與實(shí)現(xiàn),為了能夠溫故而知新,特地寫了這篇文章,以便時時學(xué)習(xí)2021-11-11
Java反射之類的實(shí)例對象的三種表示方式總結(jié)
下面小編就為大家?guī)硪黄狫ava反射之類的實(shí)例對象的三種表示方式總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10
Java中數(shù)組復(fù)制的三種方式小結(jié)
在Java中,數(shù)組復(fù)制是一種常見的操作,它允許開發(fā)人員在不修改原始數(shù)組的情況下創(chuàng)建一個新的數(shù)組,本文就來介紹三種方法,具有一定的參考價值,感興趣的可以了解一下2024-02-02

