1 枚舉好用嗎? 數據字典型欄位,枚舉比Integer好: 限定值,只能賦值枚舉的那幾個實例,不能像Integer隨便輸,保存和查詢的時候特別有用 含義明確,使用時不需要去查數據字典 顯示值跟存儲值直接映射,不需要手動轉換,比如1在頁面上顯示為啟用,0顯示禁用,枚舉定義好可以直接顯示 基於enum可 ...
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 發佈!