JPA不識別MySQL的列舉型別

公众号-JavaEdge發表於2024-04-01

1 列舉好用嗎?

資料字典型欄位,列舉比Integer好:

  • 限定值,只能賦值列舉的那幾個例項,不能像Integer隨便輸,儲存和查詢的時候特別有用
  • 含義明確,使用時不需要去查資料字典
  • 顯示值跟儲存值直接對映,不需要手動轉換,比如1在頁面上顯示為啟用,0顯示禁用,列舉定義好可以直接顯示
  • 基於enum可以新增一些擴充方法

但預設

2 JPA不識別MySQL 的 enum 型別

會報錯:

Cannot determine value type from string 'waiting'"

需新增指定註解,如:

@Enumerated(EnumType.ORDINAL)
@Column(name = "STATUS")
private StatusEnum status;

Enumerated提供兩種

3 持久化列舉

3.1 EnumType.ORDINAL

按列舉的順序儲存數字。缺點:

順序性

java列舉的順序從0開始遞增,沒法自己指定,我有些列舉並不是從0開始的,或者不是+1遞增的,比如一些行業的標準程式碼。

舊資料可能不相容

如-1代表刪除,對映不了。

不健壯

專案那麼多人開發,保不準一個豬隊友往列舉中間加了一個值,那完了,資料庫裡的記錄就要對不上了。資料錯誤沒有異常,發現和排查比較困難。

3.2 EnumType.STRING

儲存列舉的值,即toString()的值。

也有侷限性:

  • String型別,資料庫定義int,即使override toString方法返回數字的String,JPA也儲存不了
  • 同樣不適用舊資料,舊資料是int
  • 不能改名,改了後資料庫的記錄對映不了

我對列舉需求其實很簡單:

  • 儲存int型
  • 值可自己指定

可惜預設的那兩種都實現不了。

沒法,只能考慮在儲存和取出的時候自己轉換,找到實體轉換器AttributeConverter,自定義儲存好取出時的資料轉換,解決!

關注我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都技術專家,多家大廠後端一線研發經驗,在分散式系統、和大資料系統等方面有多年的研究和實踐經驗,擁有從零到一的大資料平臺和基礎架構研發經驗,對分散式儲存、資料平臺架構、資料倉儲等領域都有豐富實踐經驗。

各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統效能最佳化
  • 活動&優惠券等營銷中臺建設
  • 交易平臺及資料中臺等架構和開發設計
  • 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化

目前主攻降低軟體複雜性設計、構建高可用系統方向。

參考:

  • 程式設計嚴選網

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章