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 釋出!