JPA大坑 ,無法像mybaits一樣在current_at字段,自動生成創建時間

JPA大坑 ,無法像mybaits一樣在current_at字段,自動生成創建時間

mybatis

在mybatis項目中,我們一般會使用它的插件plus以擴充它的基本查詢功能。另一方面,在阿里巴巴開發手冊的規範中也提到,在數據庫表創建的時候,一般會有一個create_time和update_time字段,它們的建表語句往往如下:

'create_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
'update_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

創建者則是希望在行insert的時候會自動生成create_time,同時在其它行進行修改後,執行update操作會自動更新update_time字段。這樣簡化了開發,只要存儲業務字段就可以了,開發者不用管時間字段的生成。

jpa下實體類的保存

新項目使用jpa,我也想當然的在表下create_at字段設置 NOT NULL DEFAULT CURRENT_TIMESTAMP,結果調save(entity)保存實體類的時候,發現根本沒有像我想的那樣在創建時間字段保存insert的時間,所有生成時間字段都爲null…
打印sql語句才發現,原先調jpa的save方法,默認jpa會把所有字段都insert,爲空的話就會自己設置null insert到表中,導致字段設置NOT NULL DEFAULT CURRENT_TIMESTAMP失效,所有的創建時間字段都得自己set當前時間這個與業務無關的字段,忘了的話就會報錯了,效率低容易出錯。最後發現還得在相應的實體類字段寫如下注釋纔可以實現與mybaits相同的效果,交由數據庫去實現創建時間的創建。


    @Column(name = "create_at",insertable = false,updatable = false,columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    private Date createAt;
    @Column(name = "update_at",insertable = false,updatable = false,columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    private Date updateAt;

columnDefinition和後面的設置,就等於在數據庫中設置DEFAULT CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP了,這樣設置就會讓createTime成爲創建時間,updateTime成爲更新時間,數據庫會自動去維護他。

但是還有一個問題,jpa調用save方法時,會把這兩個字段覆蓋掉。所以這裏需要insertable = false,updatable = false,這樣jpa更新插入時就不會去更新這個字段了,而是完全由數據庫維護。


參考文檔

https://blog.csdn.net/weixin_30666401/article/details/96759783

發佈了17 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章