SpringBoot 填坑 | CentOS7.4 環境下,表時間欄位預設值設定失效
微信公眾號:一個優秀的廢人
前言
如題,今天這篇是一個剛認識不久的小師弟的投稿。交談中感覺技術水平與程式碼素養非常高,關鍵是才大二呀。那會我應該還在玩泥巴吧,真是後生可畏。
問題描述
我在本地端( windos 端,資料庫版本 MySQL5.7、SpringBoot2.1.3、資料訪問框架 JPA)測試程式碼時 current_timestamp 屬性只要設有置預設值,就會自動生成資料的建立時間,與修改資料之後的修改時間。但是在 CentOS 伺服器中。呼叫 JPA 中 save() 方法。欄位卻不會自動生成了。
1、這是其中一張資料庫的案例:
CREATE TABLE `user_info`( `id` int(32) NOT NULL AUTO_INCREMENT, `username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `shop_type` int(11) NULL DEFAULT NULL COMMENT '店鋪編號', `salt` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '鹽', `status` int(64) NOT NULL COMMENT '賬號狀態', `openid` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '微信openid', `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '建立時間', `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改時間', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `upe_seller_info_username`(`username`) USING BTREE );
從上面 SQL 示例可以注意到表字段,建立時間和更新時間設定了預設值 CURRENT_TIMESTAMP(0) 。
2、這是傳送的建立使用者請求,裡面的邏輯有 save 方法:
3、這是在線上伺服器報的錯誤
問題排查
前面我說了,我已經設定了欄位有預設值的。。但是為什麼在線上伺服器居然沒有自動生成。我百思不得其解,在本地端安然無恙,怎麼線上環境炸了呢?而且我還在日誌中發現一般都是 insert 中會出錯誤。
嘗試解決:首先我在 entity 層中刪除了createtime,updatetime,果然不報空了。但是在我的 freemarker 上又必須有這個欄位怎麼辦呢?
解決問題
在你的 createtime,updatetime 上分別加上 @CreatedDate 和 @LastModifiedDate 在 entity 類上加註解 @EntityListeners(AuditingEntityListener.class) 還要在你的啟動類加上 @EnableJpaAuditing ,問題迎刃而解。
entity類
@Data @Entity @DynamicUpdate // 生成動態SQL語句,即在插入和修改資料的時候,語句中只包括要插入或者修改的欄位。 @EntityListeners(AuditingEntityListener.class) public class UserInfo { @Id @GeneratedValue private Integer id; private String username; private String password; //店鋪編號 private Integer shopType; //加鹽 private String salt; private Integer status; //賣家微信openid private String openid; //建立時間 @CreatedDate @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; //更新時間 @LastModifiedDate @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; }
啟動類
@SpringBootApplication @EnableSwagger2 @EnableJpaAuditing public class ShipApplication { public static void main(String[] args) { SpringApplication.run(ShipApplication.class, args); } }
至此,問題解決。
註解解釋
@CreatedDate //表示該欄位為建立時間時間欄位,在這個實體被insert的時候,會設定值 @LastModifiedDate //同理 @EntityListeners(AuditingEntityListener.class) // JPA審計 @EnableJpaAuditing//開啟JPA審計
我的思考
我個人的理解是當我們新增這些註解後,JPA 的審計功能會把值再重複設定進 createtime,updatetime 這兩個欄位裡面,第一遍是資料庫層預設值,第二遍就是程式碼層設定的。
後語
如果本文對你哪怕有一丁點幫助,請幫忙點好看。你的好看是我堅持寫作的動力。
另外,關注之後在傳送 1024 可領取免費學習資料。資料內容詳情請看這篇舊文: Python、C++、Java、Linux、Go、前端、演算法資料分享