java - Hibernate @Enumerated 映射

标签 java hibernate jpa enums

Hibernate 提供了 @Enumerated 注解,它支持两种类型的 Enum 映射,使用 ORDINALSTRING。当我们使用 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.OSTATUS.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/

相关文章:

java - 使用 JPA 注释方法的 hibernate Maven 原型(prototype)

hibernate - 如何在 grails 脚本中建立 Hibernate session

java - 错误号 : 150 in creating table via hibernate

java - 线程 "main"中的异常 org.hibernate.UnknownEntityTypeException : Unable to locate persister

java - JPA TypedQuery 错误

java - 在应用程序中使用两个 hibernate.cfg.xml 文件

java - AccessDecisionManager 中的 HTTP 请求缺少 header

hibernate - java.lang.ClassNotFoundException : org. hibernate 代理.EntityNotFoundDelegate

java - 无法执行 SQL 语句

带有 fork 的 Java 并行进程