【问题标题】:Hibernate enum throw Unknown name value [true] for enum class休眠枚举抛出枚举类的未知名称值[true]
【发布时间】:2015-07-28 14:43:00
【问题描述】:

我正在使用 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;
    }
}

在我的表结构中,我定义了 enum{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,则它可以正常工作。我做错了什么。

【问题讨论】:

    标签: java spring hibernate enums hibernate-mapping


    【解决方案1】:

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

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

    因为不能覆盖valueOf(),所以默认实现会使用name()返回的值。

    要修复它,您需要在 Enum 中添加以下静态方法:

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

    【讨论】:

    • 这个方法什么时候被调用?是在将 String 转换为 Enum 时进行的隐式调用还是我必须进行此调用?
    猜你喜欢
    • 2013-07-03
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多