Java hibernate 遇到的問題:could not read a hi value

在使用spring-data-jpa進行開發的過程中,在向數據庫中的某張表中添加一條記錄時,hibernate出現瞭如下錯誤:

在這裏插入圖片描述

根據錯誤描述,需要在數據庫中添加表:hibernate_sequence。但是我在使用領域(domain)驅動建模生成數據表時,並沒有要求生成這個表。那麼問題出在什麼地方呢?使用數據庫圖形化界面查看的生成的數據表。
在這裏插入圖片描述

很奇怪,這個表在hibernate自動建表時,就隨之創建了。由於上面報出的錯誤是:id標識符生成異常,這個錯誤是否是由於id主鍵生成策略導致的呢?查看添加數據時操作的實體類

在這裏插入圖片描述

在這裏插入圖片描述

通過查看@GeneratedValue源碼,發現採用註解@GeneratedValue來設置主鍵id,在沒有給出指定的生成策略時,JPA的默認主鍵生成策略是上面截圖所示。所以此時,@GeneratedValue 等價於 @GeneratedValue(strategy = GenerationType.AUTO)。採用默認的主鍵生成策略GenerationType.Auto,會把主鍵生成策略交給JPA廠商(Persistence Provider),由它根據具體的數據庫選擇合適的策略。通過查閱資料發現,JPA廠商(Persistence Provider)選擇瞭如下的主鍵生成策略。

在這裏插入圖片描述

所以正是由於使用了JPA的默認生成策略GenerationType.Auto,纔會導致在使用hibernate自動建表時,數據庫纔會創建了hibernate_sequence表。並報出瞭如下的錯誤:

org.hibernate.id.IdentifierGenerationException: could not read a hi value - you need to populate the table: hibernate_sequence

找到問題的所在,就好解決了。

只要改變JPA的默認主鍵生成策略就好了,處理方法:
設置主鍵生成策略爲:@GeneratedValue(strategy=GenerationType.IDENTITY)(主鍵id自增)

修改完成後,重啓啓動tomcat服務,嘗試向數據庫中指定的表中添加一條記錄。這時,又出現了新的問題。

在這裏插入圖片描述

已經把主鍵生成策略修改爲主鍵ID自增,怎麼還會出現這樣的問題?查看數據表結構
在這裏插入圖片描述

發現在實體類中修改的主鍵生成策略,工程啓動時,hibernate並沒有把修改同步到數據庫的這張表中。這時,手動把主鍵自增這項勾選上。重啓tomcat服務,再次向這張表中添加數據。

在這裏插入圖片描述

在這裏插入圖片描述

控制檯輸出添加成功的sql語句,數據庫表中也多了一條記錄,數據添加成功。問題得到了解決。

新手創作,所以分析的不到位,往大家補充完善。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章