JPA不識別MySQL的枚舉類型

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

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