Hibernate枚举为枚举类抛出未知名称值[true]

时间:2015-05-16 20:29:20

标签: java spring hibernate enums hibernate-mapping

我正在使用MySQL,我的列数据类型为 Enum ,我在我的实体中定义了一个枚举类型但是当查询执行以检索数据时,它会抛出以下异常:

Caused by: java.lang.IllegalArgumentException: Unknown name value [true] for enum class [com.myproject.MyEnum]
    at org.hibernate.type.EnumType$NamedEnumValueMapper.fromName(EnumType.java:467)
    at org.hibernate.type.EnumType$NamedEnumValueMapper.getValue(EnumType.java:452)
    at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:107)

以下是我的实体和枚举来源

public enum MyEnum {
    TRUE("true"),
    FALSE("false");

    private final String name;

    private MyEnum (String name){
        this.name = name;
    } 

    public String toString(){
        return name;
    }
}

在我的表结构中,我定义了枚举{true,false}

@Entity
@Table(name="networthcashother")
public class Networthcashother {
    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String assetName;
    private String assetDescription;

    @Enumerated(EnumType.STRING)
    private MyEnum  married; 

    public MuEnum getMarried() {
        return married;
    }

    public void setMarried(MyEnum married) {
        this.married = married;
    }
}

但是,如果我将实体属性类型从Enum更改为boolean,它可以正常工作。你做错了什么。

1 个答案:

答案 0 :(得分:6)

EnumType.STRING将使用Enum字符串表示,这意味着它将调用:

  • toString() - 将Enum转换为String表示
  • valueOf() - 将String表示转换回Enum

由于您无法覆盖valueOf(),因此默认实现将使用name()返回的值。

要修复它,您需要将以下静态方法添加到您的枚举:

public static MyEnum getEnum(String value) {
    for(MyEnum v : values())
        if(v.getValue().equalsIgnoreCase(value)) return v;
    throw new IllegalArgumentException();
}