基于@LastModifiedDate不起作用的解決方案
@LastModifiedDate不起作用
在實(shí)體中添加注解 @EntityListeners(AuditingEntityListener.class)監(jiān)聽(tīng)實(shí)體變化
在自動(dòng)更新時(shí)間戳字段增加 @LastModifiedDate
在Spring boot啟動(dòng)類(lèi)增加注解 @EnableJpaAuditing啟用JPA審計(jì)(自動(dòng)填充默認(rèn)值)
如果你是使用JPA的save(實(shí)體)方法去更新數(shù)據(jù)是沒(méi)有問(wèn)題的,如果是使用SQL/JPQL語(yǔ)句就會(huì)失效。
比如:
@Query("update xxx set x = ? where x = ?")這里提供最簡(jiǎn)單的解決辦法,語(yǔ)句里時(shí)間字段賦值CURRENT_TIMESTAMP即可。
JPA中@CreatedDate和@LastModifiedDate的使用
前些時(shí)間寫(xiě)了新項(xiàng)目,然后嘗試使用了Spring Data JPA,發(fā)現(xiàn)新世界。很多功能都可以基于注解實(shí)現(xiàn),為開(kāi)發(fā)省去了不少功夫。
關(guān)于時(shí)間的生成注解@CreatedDate和@LastModifiedDate的使用,在此記錄一下。
使用步驟
1.在實(shí)體類(lèi)上加上注解 @EntityListeners(AuditingEntityListener.class),在相應(yīng)的字段上添加對(duì)應(yīng)的時(shí)間注解 @LastModifiedDate 和 @CreatedDate。
注意:日期的類(lèi)型可以使用Date,也可以使用Long。我一般習(xí)慣用Date。
//@Data lombok注解,替我們生成getter和setter。
@Data
@Entity
@Table(name = "task")
@EntityListeners(AuditingEntityListener.class)
public class Task {
? ? /**
? ? ?* 自增主鍵
? ? ?*/
? ? @Id
? ? @GeneratedValue(strategy = GenerationType.IDENTITY)
? ? @Column(name = "id")
? ? private Integer id;
? ? /**
? ? ?* 創(chuàng)建時(shí)間
? ? ?*/
? ? @CreatedDate
? ? @Column(name = "createTime", columnDefinition = "timestamp not null default current_timestamp")
? ? private Date createTime;
? ? /**
? ? ?* 更新時(shí)間
? ? ?*/
? ? @LastModifiedDate
? ? @Column(name = "updateTime", columnDefinition = "timestamp not null default current_timestamp")
? ? private Date updateTime;
}2.在Application啟動(dòng)類(lèi)中添加注解 @EnableJpaAuditing。
@EnableJpaAuditing
@SpringBootApplication
public class TestApplication {
? ? public static void main(String[] args) {
? ? ? ? SpringApplication.run(TestApplication.class, args);
? ? }?
}3.除了上面提到的注解外,Spring Data JPA 還提供 @CreatedBy 和 @LastModifiedBy 注解,用于保存和更新當(dāng)前操作用戶的信息(如id、name)。
如果有這方面的需求,可以參考下面的配置實(shí)現(xiàn)
代碼如下:
@Data
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Task {
? ?? ?/**
? ? ?* 自增主鍵
? ? ?*/
? ? @Id
? ? @GeneratedValue(strategy = GenerationType.IDENTITY)
? ? @Column(name = "id")
? ? private Integer id;
? ? /**
? ? ?* 創(chuàng)建時(shí)間
? ? ?*/
? ? @CreatedDate
? ? @Column(name = "createTime", columnDefinition = "timestamp not null default current_timestamp")
? ? private Date createTime;
? ? /**
? ? ?* 更新時(shí)間
? ? ?*/
? ? @LastModifiedDate
? ? @Column(name = "updateTime", columnDefinition = "timestamp not null default current_timestamp")
? ? private Date updateTime;
? ? ?/**
? ? ?* 創(chuàng)建人
? ? ?*/
? ? @CreatedBy
? ? @Column(name = "createBy", columnDefinition = "varchar(255) not null")
? ? private String createBy;
? ? /**
? ? ?* 最后修改人
? ? ?*/
? ? @LastModifiedBy
? ? @Column(name = "lastModifiedBy", columnDefinition = "varchar(255) not null")
? ? private String lastModifiedBy;
}獲取操作員信息
/**
?* Spring Data JPA通過(guò)AuditorAware<T>接口獲取用戶信息,
?* 其中泛型T可以為String保存用戶名,也可以為L(zhǎng)ong/Integer保存用戶ID。
?* @author EvanWang
?*
?*/
@Component
public class AuditorConfig implements AuditorAware<String> {
? ? /**
? ? ?* 返回操作員標(biāo)志信息
? ? ?*
? ? ?* @return
? ? ?*/
? ? @Override
? ? public Optional<String> getCurrentAuditor() {
? ? ? ? // 這里應(yīng)根據(jù)實(shí)際業(yè)務(wù)情況獲取具體信息
? ? ? ? return Optional.of(userName);
? ? }
}補(bǔ)充注解
Hibernate 也提供了類(lèi)似上述時(shí)間注解的功能實(shí)現(xiàn),這種方法只需要一步配置,更改為注解 @UpdateTimestamp 和 @CreationTimestamp
代碼如下:
@Data
@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
public class Task {
? ? @Id
? ? @GeneratedValue(strategy = GenerationType.IDENTITY)
? ? @Column(name = "id")
? ? private Integer id;
? ? @UpdateTimestamp
? ? @Column(name = "updateTime", columnDefinition = "timestamp not null default current_timestamp")
? ? private Date updateTime;
? ? @CreationTimestamp
? ? @Column(name = "updateTime", columnDefinition = "timestamp not null default current_timestamp")
? ? private Date createTime;
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何解決SpringBoot啟動(dòng)時(shí)無(wú)法加載配置文件或環(huán)境變量問(wèn)題
文章主要介紹了在Spring Boot項(xiàng)目中遇到配置文件加載失敗和資源目錄圖標(biāo)異常的問(wèn)題,并提供了詳細(xì)的解決步驟,解決方法包括在pom.xml文件中添加特定配置,確保資源目錄順序正確,以及注意節(jié)點(diǎn)的正確使用,通過(guò)這些步驟,可以有效解決資源加載問(wèn)題,提高開(kāi)發(fā)效率2024-12-12
Spring AOP 中@annotation的兩種寫(xiě)法使用
本文介紹了Spring AOP中@annotation的兩種寫(xiě)法及區(qū)別,一種只攔截方法,另一種攔截并獲取注解對(duì)象,這兩種寫(xiě)法都能生效,但用途不同,選擇哪種寫(xiě)法取決于具體需求2026-02-02
MyBatis Plus 查詢結(jié)果映射為空對(duì)象的問(wèn)題及解決方案
本文詳細(xì)探討了MyBatisPlus中查詢結(jié)果映射為空對(duì)象的問(wèn)題,通過(guò)問(wèn)題重現(xiàn)、原理分析和多種解決方案,幫助開(kāi)發(fā)者有效應(yīng)對(duì)這一問(wèn)題,感興趣的朋友跟隨小編一起看看吧2025-12-12
Spring?Lifecycle?和?SmartLifecycle區(qū)別面試精講
這篇文章主要為大家介紹了Spring?Lifecycle和SmartLifecycle的區(qū)別面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Java多線程同步工具類(lèi)CyclicBarrier的使用
本文主要介紹了Java多線程同步工具類(lèi)CyclicBarrier的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Netty學(xué)習(xí)教程之Netty與Marshalling結(jié)合發(fā)送對(duì)象
Netty是由JBOSS提供的一個(gè)Java開(kāi)源框架,之前已經(jīng)給大家簡(jiǎn)單介紹了一些基礎(chǔ)與使用,下面這篇文章主要給大家介紹了關(guān)于Netty與Marshalling結(jié)合發(fā)送對(duì)象的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05
java servlet手機(jī)app訪問(wèn)接口(三)高德地圖云存儲(chǔ)及檢索
這篇文章主要為大家詳細(xì)介紹了java servlet手機(jī)app訪問(wèn)接口(三),高德地圖云存儲(chǔ)及檢索,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
SpringBoot3.x整合swagger的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot3.x整合swagger的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08

