JPA插入枚举类型字段
JPA插入枚举类型字段,有三种方式:
- 插入枚举字面值
- 插入枚举序号
- 插入枚举中自定义的值
例如,我们有个枚举类:
1
2
3
4
5
6
7
8
9
|
public enum Gender { BOY( "1" , "boy" , "Boy" ); GIRL( "2" , "girl" , "Girl" ); private int value; private String s1; private String s2; //....省略 } |
1. 插入枚举名称的值,即字符串
将BOY或GIRL存入表中,实体类字段如下:
1
2
3
4
5
|
public class Staff { @Enumerated (EnumType.STRING) private Gender gender; //...省略 } |
2. 插入枚举的序号,即ordinal
ordinal的意思就是你在类中定义枚举的顺序,从0开始。这种方式并不常用,不清楚同学修改了枚举类容易导致业务异常。
而且JPA默认的方式(不加@Enumerated注解)就是这种。
例如将BOY存入表中,这种方式将存入0。将GIRL存入表中,这种方式将存入1;
1
2
3
4
5
|
public class Staff { @Enumerated (EnumType.ORDINAL) private Gender gender; //...省略 } |
3.插入枚举中的自定义值
例如:
1
2
3
4
5
6
7
8
9
|
public enum Gender { BOY( "1" , "boy" , "Boy" ); Girl( "2" , "girl" , "Girl" ); private int value; private String s1; private String s2; //....省略 } |
如果想将BOY的数字1或者 “boy” 或者“Boy”存入表中,JPA默认是不支持的,需要自定义一个类实现特定接口: implements AttributeConverter<X,Y>。
以代码为例,详看注释,假如我想将BOY的1存入表中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class GenderConverter implements AttributeConverter<Gender, Integer>{ /** * convertToDatabaseColumn方法是转换数据到表中 * 这里是将Gender 枚举的value存入表中 */ @Override public Integer convertToDatabaseColumn(Gender attribute) { if (attribute == null ){ throw new RuntimeException( "Unknown Gender text : " + attribute); } return attribute.getValue(); } /** * convertToEntityAttribute方法是转换表中的值转换回数据 * 这里是将表中的枚举的value值转换成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); } } |
实例类:
1
2
3
4
5
6
7
8
9
10
|
public class Staff { /** * 利用 @Convert 指向自定义转换类GenderConverter * 此时JPA会根据自定义转换规则对Gender枚举类进行存取 */ @Convert (converter = GenderConverter. class ) private Gender gender; //...省略 } |
JPA枚举类型处理
1
2
3
4
5
6
7
8
|
/** * 枚举类型 * */ public enum Sex { MALE, FEMALE } |
1
2
3
4
5
6
7
8
|
/** * @Enumerated(EnumType.STRING) : 存放字符串数据 * @Enumerated(EnumType.ORDINAL) : 存放索引值 */ @Enumerated (EnumType.STRING) public Sex getSex() { return sex; } |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u013189824/article/details/106804623