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

Tal*_*kir 2 java enums spring hibernate 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)
Run Code Online (Sandbox Code Playgroud)

以下是我的Entity和Enum来源

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

    private final String name;

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

    public String toString(){
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的表结构中,我定义了枚举{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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*cea 6

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

  • toString() - 转换EnumString表示时
  • 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 这个方法何时被调用?它会在将String转换为Enum时进行隐式调用,还是必须进行此调用? (3认同)