休眠@Enumerated映射

2022-09-01 14:42:59

Hibernate 提供的注释支持使用 或 的两种类型的映射。当我们使用 映射时,它采用枚举的“名称”,而不是枚举的表示形式。在数据库列仅由一个字符组成的情况下,这是一个问题。例如,我有以下枚举:@EnumeratedEnumORDINALSTRINGEnumType.STRINGEnumtoString()

public enum Status{
  OPEN{
   @Override
   public String toString(){
     return "O";}
   },

  WAITLIST{
   @Override
   public String toString(){
     return "W";}
   },

  COMPLETE{
   @Override
   public String toString(){
     return "C";}
   }

}

当我使用 保留枚举时,Hibernate 尝试存储在数据库中的值是 OPEN。但是,我的数据库列仅由一个字符组成,因此它会引发异常。Status.OPEN@Enumerated(EnumType.STRING)

解决此问题的一种方法是更改枚举类型以保存单个字符(如 、 而不是 、 )。但是,这会降低可读性。有什么建议可以保持可读性以及将枚举映射到单个字符列吗?STATUS.OSTATUS.WSTATUS.OPENSTATUS.WAITLIST

谢谢。


答案 1

自定义枚举映射的最佳方法是使用即: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