微信公衆號:一個優秀的廢人 若有問題或建議,請後臺留言,我會盡力解決你的問題。前端
如題,今天這篇是一個剛認識不久的小師弟的投稿。交談中感受技術水平與代碼素養很是高,關鍵是才大二呀。那會我應該還在玩泥巴吧,真是後生可畏。java
我在本地端( windos 端,數據庫版本 MySQL5.七、SpringBoot2.1.三、數據訪問框架 JPA)測試代碼時 current_timestamp 屬性只要設有置默認值,就會自動生成數據的建立時間,與修改數據以後的修改時間。可是在 CentOS 服務器中。調用 JPA 中 save() 方法。字段卻不會自動生成了。算法
一、這是其中一張數據庫的案例:sql
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) 。數據庫
二、這是發送的建立用戶請求,裏面的邏輯有 save 方法:服務器
三、這是在線上服務器報的錯誤微信
####問題排查 前面我說了,我已經設置了字段有默認值的。。可是爲何在線上服務器竟然沒有自動生成。我百思不得其解,在本地端安然無恙,怎麼線上環境炸了呢?並且我還在日誌中發現通常都是 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、前端、算法資料分享