JPA大坑 ,無法像mybaits一樣在current_at字段,自動生成創建時間
mybatis jpa下實體類的保存
在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