Hibernate Exception - 未知的名称值

时间:2014-06-21 05:33:37

标签: java hibernate enums

我有类似的问题[Hibernate Exception: Unknown name value for enum class

但就我而言,

Unable to filter, so returning non filtered results.Unknown name value for enum class com.xxxx.enums.Status: DELIVERED
java.lang.IllegalArgumentException: Unknown name value for enum class com.xxxx.enums.Status: DELIVERED
    at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:128)
    at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:109)
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:104)


@Enumerated(value = EnumType.STRING)
@Column(name = "status", length = 10)
@AuditableField
private Status status;

public enum ReleaseStatus {
     DL("Delivered"),
}

一切似乎都很好,但我仍然遇到了这个例外。

2 个答案:

答案 0 :(得分:9)

您的表格中有字符串DELIVERED。此字符串应该是name()个实例之一的ReleaseStatus。并且ReleaseStatus没有任何名为DELIVERED的实例。您发布的唯一一个名为DL

那么表格中的内容应该是DL而不是DELIVERED。或者您应该将枚举实例重命名为DELIVERED,以匹配数据库表中存储的内容。

您可以定义一个自定义Hibernate用户类型,并将其用于此枚举,以便在获得" DELIVERED"从数据库中,Hibernate找到使用此值构造的枚举实例(并忽略大小写)。但是从一开始就存储正确的值对我来说似乎更好。

答案 1 :(得分:9)

我更喜欢定义一个自定义转换器,如:

    @Column
    @Convert(converter = StatusFirmaDocumentoConverter.class)  <<<<< :)
    @AuditableField
    private Status status;

(注意:执行包含@Enumerated属性)并创建转换器来处理枚举器值,如:

public class CustomConverter implements AttributeConverter<Status, String> {

    @Override
    public String convertToDatabaseColumn(Status attribute) {
        return attribute.getValue() ;
    }

    @Override
    public Status convertToEntityAttribute(String dbData) {
        return  StatusFirmaDocumento.fromString(dbData);
    }

}

是的,你无法告诉他们“将 DL 转换为交付”并且反之亦然,这是一种耻辱