我有类似的问题[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"),
}
一切似乎都很好,但我仍然遇到了这个例外。
答案 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 转换为交付”并且反之亦然,这是一种耻辱