使用JPA映射枚举

时间:2016-09-21 15:29:04

标签: java hibernate jpa enums

我正在尝试将存储在数据库中的字符串(例如ABC1,BCD2)映射到枚举(ABC_1,BCD_2)。

使用hibernate我可以使用以下hibernate映射

来完成此操作
<typedef name="LinkEnum" class="GenericEnumUserType">
    <param name="enumClass">types.LinkEnum</param>
    <param name="identifierMethod">value</param>
    <param name="valueOfMethod">fromValue</param>
</typedef>

和LinkEnum

@XmlType(name = "LinkEnum")
@XmlEnum
public enum LinkEnum {

@XmlEnumValue("ABC1")
ABC_1("ABC1"),
@XmlEnumValue("BCD2")
BCD_2("BCD2");
private final String value;

LinkEnum(String v) {
    value = v;
}

public String value() {
    return value;
}

public static LinkEnum fromValue(String v) {
    for (LinkeEnum c: LinkEnum.values()) {
        if (c.value.equals(v)) {
            return c;
        }
    }
    throw new IllegalArgumentException(v);
}
}

在JPA类中,我正在尝试执行相同类型的映射,但是它仍然存在映射枚举的问题。有没有与JPA相同的方法呢?

private LinkEnum link;

@Enumerated(EnumType.STRING)
@Column(name = "LINK", nullable = false, length = 8)
public LinkEnum getLink() {
    return this.link;
}

3 个答案:

答案 0 :(得分:1)

你也可以使用javax.persistence.AttributeConverter(比上面的解决方案更自由)。

为此,实现一个实现AttributeConverter的类,并在类中注释您的成员,如下所示:

@Convert(converter = NameOfYourConverter.class)

答案 1 :(得分:0)

对@Enumerated

的文档有一个很好的解释
public enum EmployeeStatus {FULL_TIME, PART_TIME, CONTRACT}

public enum SalaryRate {JUNIOR, SENIOR, MANAGER, EXECUTIVE}

@Entity public class Employee {
   //@Enumerated is not mandatory. If it's not specified, It assumes to be an ORDINAL (by default)
   public EmployeeStatus getStatus() {...}
   ...
   @Enumerated(EnumType.STRING)
   public SalaryRate getPayScale() {...}
   ...

}

https://docs.oracle.com/javaee/7/api/javax/persistence/Enumerated.html

答案 2 :(得分:0)

像这样定义你的枚举:

public enum LinkEnum {ABC_1("ABC1"), BCD_2("BCD2")}

您的实体,您可以这样注释:

@Enumerated(EnumType.STRING)
   public LinkEnum getLinkEnum() {...}