Hibernate提供@Enumerated
注释,支持使用Enum
或ORDINAL
两种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.O
,STATUS.W
而不是STATUS.OPEN
,STATUS.WAITLIST
)。但是,这降低了可读性。有关保持可读性以及将Enum映射到单个字符列的建议吗?
感谢。
答案 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)
检查这两篇文章 - http://community.jboss.org/wiki/Java5EnumUserType和http://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn
他们通过自定义UserType解决问题。
答案 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()