Hibernate 提供了 @Enumerated
注解,它支持两种类型的 Enum
映射,使用 ORDINAL
或 STRING
。当我们使用 EnumType.STRING
进行映射时,它采用 Enum
的“名称”,而不是 Enum 的 toString()
表示。在数据库列仅包含一个字符的情况下,这是一个问题。例如,我有以下枚举:
public enum Status{
OPEN{
@Override
public String toString(){
return "O";}
},
WAITLIST{
@Override
public String toString(){
return "W";}
},
COMPLETE{
@Override
public String toString(){
return "C";}
}
}
当我使用 @Enumerated(EnumType.STRING)
持久化枚举 Status.OPEN
时,Hibernate 尝试存储在数据库中的值是 OPEN。但是,我的数据库列仅包含一个字符,因此会引发异常。
解决此问题的一种方法是更改 Enum 类型以保存单个字符(如 STATUS.O
、STATUS.W
而不是 STATUS.OPEN
、STATUS.WAITLIST
)。但是,这会降低可读性。有什么建议可以保持可读性以及将 Enum 映射到单个字符列?
谢谢。
最佳答案
为枚举自定义映射的最佳方法是使用 AttributeConverter
即:
@Entity
public class Person {
...
@Basic
@Convert( converter=GenderConverter.class )
public Gender gender;
}
public enum Gender {
MALE( 'M' ),
FEMALE( 'F' );
private final char code;
private Gender(char code) {
this.code = code;
}
public char getCode() {
return code;
}
public static Gender fromCode(char code) {
if ( code == 'M' || code == 'm' ) {
return MALE;
}
if ( code == 'F' || code == 'f' ) {
return FEMALE;
}
throw ...
}
}
@Converter
public class GenderConverter
implements AttributeConverter<Gender, Character> {
public Character convertToDatabaseColumn(Gender value) {
if ( value == null ) {
return null;
}
return value.getCode();
}
public Gender convertToEntityAttribute(Character value) {
if ( value == null ) {
return null;
}
return Gender.fromCode( value );
}
}
您可以在 Hibernate 文档中找到它: http://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html_single/#d5e678
关于java - Hibernate @Enumerated 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5450902/