Hibernate提供的@Enumerated注释支持Enum使用ORDINAL或的两种类型的映射STRING。当我们使用映射时EnumType.STRING,它使用的“名称” Enum而不是toString()Enum的表示形式。在数据库列仅包含一个字符的情况下,这是一个问题。例如,我有以下枚举:
@Enumerated
Enum
ORDINAL
STRING
EnumType.STRING
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尝试在数据库中存储的值是开放的。但是,我的数据库列仅包含一个字符,因此会引发异常。
Status.OPEN
@Enumerated(EnumType.STRING)
克服这个问题的一个办法是改变枚举类型持有单个字符(如STATUS.O,STATUS.W代替STATUS.OPEN,STATUS.WAITLIST)。但是,这降低了可读性。有什么建议可以保留可读性以及将Enum映射到单个字符列吗?
STATUS.O
STATUS.W
STATUS.OPEN
STATUS.WAITLIST
谢谢。
检查这两篇文章-http://community.jboss.org/wiki/Java5EnumUserType和http://community.jboss.org/wiki/UserTypeforpersistingingaTypesafeEnumerationwithaVARCHAR列
他们通过自定义UserType解决了问题。