Hibernate @Enumerated映射

时间:2011-03-27 17:23:22

标签: java hibernate jpa enums

Hibernate提供@Enumerated注释,支持使用EnumORDINAL两种STRING映射。当我们使用EnumType.STRING进行地图绘制时,它会使用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";}
   }

}

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

解决此问题的一种方法是将枚举类型更改为包含单个字符(例如STATUS.OSTATUS.W而不是STATUS.OPENSTATUS.WAITLIST)。但是,这降低了可读性。有关保持可读性以及将Enum映射到单个字符列的建议吗?

感谢。

3 个答案:

答案 0 :(得分:13)

最好为枚举定制映射是使用...if num>1: for i in range(2, num): if (num%i)==0: break else: print(num) ,即:

AttributeConverter

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

答案 1 :(得分:8)

答案 2 :(得分:-4)

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()