# [Spring Data JPA] 自動存入時間和使用者
[TOC]
- `@CreatedDate` 資料新增時會自動存入創建時間
- `@CreatedBy` 創建者
- `@LastModifiedDate` 最後修改時間
- `@LastModifiedBy` 最後修改者
### :triangular_flag_on_post: **使用步驟**
1. 啟動類別加上注釋 `@EnableJpaAuditing`
- Application
```=java
@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
```
2. 需要自動生成的實體類別(@Entity)須加上注釋 `@EntityListeners(AuditingEntityListener.class)`,並在對應的變數(欄位)加上注釋 `@CreatedDate`、`@CreatedBy`、`@LastModifiedDate`、`@LastModifiedBy`。
- Entity
```=java
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable<T> {
@CreatedBy
@Column(name = "created_by")
private T createdBy;
@CreatedDate
@Column(name = "created_date")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdDate = new Date();
@LastModifiedBy
@Column(name = "last_modified_by")
private T lastModifiedBy;
@LastModifiedDate
@Column(name = "last_modified_date")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastModifiedDate = new Date();
}
```
3. 現在時間會自動存入資料庫,但`@CreatedBy`和`@LastModifiedBy`因為沒有被賦值,欄位為空(null),必須實作AuditorAware介面的getCurrentAuditor()方法來傳回需要的值
- AuditorAware
```=java
@Component("auditorAware")
public class MyAuditorAware implements AuditorAware<String>{
@Override
public Optional<String> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication == null || !authentication.isAuthenticated()) {
return null;
}
return Optional.of(((MyUserDetails)authentication.getPrincipal()).getUsername());
}
}
```
---
參考資料:
[Spring JPA 使用@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 自动生成时间和修改者 - 簡書](https://www.jianshu.com/p/14cb69646195)
[3. Auditing - Part I. Reference Documentation](https://docs.spring.io/spring-data/jpa/docs/1.7.0.DATAJPA-580-SNAPSHOT/reference/html/auditing.html)