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 發佈!