JPA 实体枚举枚举字段的映射
最编程
2024-04-22 10:34:20
...
0. 准备实体和枚举
@Data
@Entity
@Table(name = "person")
public class Person {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "gender")
private Gender gender;
}
public enum Gender {
MALE,
FEMALE;
}
1. 映射枚举序号(ordinal)
枚举字段不加任何注解,或者加 @Enumerated(EnumType.ORDINAL)
表示映射枚举对象的 ordinal 属性,即枚举值的下标(从0开始,和 enume 的定义顺序有关)
@Enumerated(value = EnumType.ORDINAL)
@Column(name = "gender")
private Gender gender;
单元测试
personRepository.save(new Person("张三", Gender.MALE));
personRepository.save(new Person("李四", Gender.FEMALE));
执行结果
2. 映射枚举名称(name)
枚举字段加 @Enumerated(EnumType.STRING)
表示映射枚举对象的 name 属性,即枚举值的名称
@Enumerated(value = EnumType.STRING)
@Column(name = "gender")
private Gender gender;
执行结果
3. 映射枚举自定义value属性
比如要映射下列 Gender 的 value 字段时,就需要通过 @Convert
注解来实现了
public enum Gender {
MALE("男士"),
FEMALE("女士");
private final String value;
private Gender(String value) {
this.value = value;
}
// value 转枚举
public static Gender fromValue(String value) {
for (Gender gender : values()) {
if (gender.toValue().equals(value)) {
return gender;
}
}
return null;
}
// 枚举转 value
public String toValue() {
return value;
}
}
实现 AttributeConverter
接口,创建 Gender 的自定义转换器
public class GenderConverter implements AttributeConverter<Gender, String> {
@Override
public String convertToDatabaseColumn(Gender gender) {
return gender.toValue();
}
@Override
public Gender convertToEntityAttribute(String value) {
return Gender.fromValue(value);
}
}
枚举字段加 @Convert
注解
@Convert(converter = GenderConverter.class)
@Column(name = "gender")
private Gender gender;
执行结果
上一篇: 为什么枚举子集是 O(3^n)
下一篇: c/c++ 枚举类型及其遍历