欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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));

执行结果

image.png

2. 映射枚举名称(name)

枚举字段加 @Enumerated(EnumType.STRING) 表示映射枚举对象的 name 属性,即枚举值的名称

@Enumerated(value = EnumType.STRING)
@Column(name = "gender")
private Gender gender;

执行结果

image.png

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;

执行结果

image.png