Hibernate @Enumerated映射

sar*_*_pc 26 java enums hibernate jpa

Hibernate提供了@Enumerated注释,它支持Enum使用ORDINAL或支持两种类型的映射STRING.当我们使用map时EnumType.STRING,它采用的是"名称",Enum而不是toString()Enum 的表示.在数据库列仅包含一个字符的情况下,这是一个问题.例如,我有以下枚举:

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

当我坚持枚举Status.OPEN使用@Enumerated(EnumType.STRING),即Hibernate试图在数据库中存储的值是开放的.但是,我的数据库列只包含一个字符,因此会引发异常.

克服这个问题的一个办法是改变枚举类型持有单个字符(如STATUS.O,STATUS.W代替STATUS.OPEN,STATUS.WAITLIST).但是,这降低了可读性.有关保持可读性以及将Enum映射到单个字符列的建议吗?

谢谢.

Ond*_*zek 14

最好自定义枚举映射是使用AttributeConverterie:

@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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以在Hibernate docs中找到它:http: //docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html_single/#d5e678


Boz*_*zho 8

查看这两篇文章 - http://community.jboss.org/wiki/Java5EnumUserTypehttp://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn

他们通过自定义UserType解决问题.

  • 有没有人使用上面链接的解决方案,并能够进行枚举映射?我正在使用Hibernate 3.6.7,我没有TypeFactory.basic方法.关于我应该如何前进的任何提示? (3认同)

小智 -5

public enum Status
{
    OPEN("O"),
    WAITLIST("W"),
    COMPLETE("C")

private String description;

private Status(String description)
{
   this.description = description;
}

public String getDescription()
{
    return description;
}
}

and then when you read it:

Status.OPEN.getDescription()
Run Code Online (Sandbox Code Playgroud)