使用JPA插入枚舉類型字段
JPA插入枚舉類型字段
JPA插入枚舉類型字段,有三種方式:
- 插入枚舉字面值
- 插入枚舉序號(hào)
- 插入枚舉中自定義的值
例如,我們有個(gè)枚舉類:
public enum Gender { ? ? BOY("1" , "boy" , "Boy"); ? ? GIRL("2" , "girl" , "Girl"); ? ? ? private int value; ? ? private String s1; ? ? private String s2; ? ? //....省略 }
1. 插入枚舉名稱的值,即字符串
將BOY或GIRL存入表中,實(shí)體類字段如下:
public class Staff { ? ? @Enumerated(EnumType.STRING) ? ? private Gender gender; ? ? //...省略 }
2. 插入枚舉的序號(hào),即ordinal
ordinal的意思就是你在類中定義枚舉的順序,從0開始。這種方式并不常用,不清楚同學(xué)修改了枚舉類容易導(dǎo)致業(yè)務(wù)異常。
而且JPA默認(rèn)的方式(不加@Enumerated注解)就是這種。
例如將BOY存入表中,這種方式將存入0。將GIRL存入表中,這種方式將存入1;
public class Staff { ? ? @Enumerated(EnumType.ORDINAL) ? ? private Gender gender; ? ? //...省略 }
3.插入枚舉中的自定義值
例如:
public enum Gender { ? ? BOY("1" , "boy" , "Boy"); ? ? Girl("2" , "girl" , "Girl"); ? ? ? private int value; ? ? private String s1; ? ? private String s2; ? ? //....省略 }
如果想將BOY的數(shù)字1或者 “boy” 或者“Boy”存入表中,JPA默認(rèn)是不支持的,需要自定義一個(gè)類實(shí)現(xiàn)特定接口: implements AttributeConverter<X,Y>。
以代碼為例,詳看注釋,假如我想將BOY的1存入表中:
public class GenderConverter implements AttributeConverter<Gender, Integer>{ ? ? /** ? ? ?* convertToDatabaseColumn方法是轉(zhuǎn)換數(shù)據(jù)到表中 ? ? ?* 這里是將Gender 枚舉的value存入表中 ? ? ?*/ ?? ?@Override ?? ?public Integer convertToDatabaseColumn(Gender attribute) { ?? ??? ?if(attribute == null){ ?? ??? ??? ?throw new RuntimeException("Unknown Gender text : " + attribute); ?? ??? ?} ?? ??? ?return attribute.getValue(); ?? ?} ? ? ? /** ? ? ?* convertToEntityAttribute方法是轉(zhuǎn)換表中的值轉(zhuǎn)換回?cái)?shù)據(jù) ? ? ?* 這里是將表中的枚舉的value值轉(zhuǎn)換成gender枚舉 ? ? ?*/ ?? ?@Override ?? ?public Gender convertToEntityAttribute(Integer dbData) { ?? ??? ?for(Gender s : Gender.values()){ ?? ??? ??? ?if(s.getValue() == (dbData)){ ?? ??? ??? ??? ?return s; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?throw new RuntimeException("Unknown Gender text : " + dbData); ?? ?} }
實(shí)例類:
public class Staff { ? ?? ? ?/** ? ? * 利用 @Convert 指向自定義轉(zhuǎn)換類GenderConverter ? ? * 此時(shí)JPA會(huì)根據(jù)自定義轉(zhuǎn)換規(guī)則對(duì)Gender枚舉類進(jìn)行存取 ? ? */ ? ? @Convert(converter = GenderConverter.class) ? ? private Gender gender; ? ? //...省略 }
JPA枚舉類型處理
/** ?* 枚舉類型 ?* ?*/ public enum Sex { ? ? MALE, ? ? FEMALE }
/** * @Enumerated(EnumType.STRING) : 存放字符串?dāng)?shù)據(jù) * @Enumerated(EnumType.ORDINAL) : 存放索引值 */ @Enumerated(EnumType.STRING) public Sex getSex() { ? ? return sex; }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案
今天小編就為大家分享一篇關(guān)于Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04Java開發(fā)者就業(yè)需要掌握的9大專業(yè)技能
這篇文章主要為大家詳細(xì)介紹了java就業(yè)前需要掌握的專業(yè)技能,感興趣的小伙伴們可以參考一下2016-09-09Java判斷一個(gè)時(shí)間是否在當(dāng)前時(shí)間區(qū)間代碼示例
這篇文章主要給大家介紹了關(guān)于使用Java判斷一個(gè)時(shí)間是否在當(dāng)前時(shí)間區(qū)間的相關(guān)資料,在日常開發(fā)中我們經(jīng)常會(huì)涉及到時(shí)間的大小比較或者是判斷某個(gè)時(shí)間是否在某個(gè)時(shí)間段內(nèi),需要的朋友可以參考下2023-07-07JDK17、JDK19、JDK1.8輕松切換(無(wú)坑版,小白也可以看懂!)
在做不同的java項(xiàng)目時(shí)候,因項(xiàng)目需要很可能來(lái)回切換jdk版本,下面這篇文章主要介紹了JDK17、JDK19、JDK1.8輕松切換的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02MyBatis中有關(guān)int和Integer的使用方式
這篇文章主要介紹了MyBatis中有關(guān)int和Integer的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Spring Boot應(yīng)用事件監(jiān)聽示例詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用事件監(jiān)聽的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12Mybatis 實(shí)現(xiàn)動(dòng)態(tài)組裝查詢條件,仿SQL模式
這篇文章主要介紹了Mybatis 實(shí)現(xiàn)動(dòng)態(tài)組裝查詢條件,仿SQL模式的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06以Java代碼為例講解設(shè)計(jì)模式中的簡(jiǎn)單工廠模式
簡(jiǎn)單來(lái)說(shuō),工廠模式就是按照需求來(lái)返回一個(gè)類型的對(duì)象,使用工廠模式的意義就是,如果對(duì)象的實(shí)例化與代碼依賴太大的話,不方便進(jìn)行擴(kuò)展和維護(hù),使用工廠的目的就是使對(duì)象的實(shí)例化與主程序代碼就行解耦.來(lái)具體看一下:2016-05-05