Java Hibernates使用JPA@Enumerated注释生成VARBINARY列
Hibernates正在生成一个带有JPA@Enumerated注释的VARBINARY列。我使用的是SQLServer2005W/JTDS驱动程序。映射非常简单:Java Hibernates使用JPA@Enumerated注释生成VARBINARY列,java,hibernate,orm,jpa,Java,Hibernate,Orm,Jpa,Hibernates正在生成一个带有JPA@Enumerated注释的VARBINARY列。我使用的是SQLServer2005W/JTDS驱动程序。映射非常简单: @Basic @Enumerated(EnumType.ORDINAL) private MyEnum foo; 我希望Hibernate生成一个整数列?我还尝试了EnumType.STRING(应为varchar列),但没有成功 请注意,我的应用程序运行良好;列类型使检查数据库和在戳数据库时发出临时SQL变得困难。可能是SQL
@Basic
@Enumerated(EnumType.ORDINAL)
private MyEnum foo;
我希望Hibernate生成一个整数列?我还尝试了EnumType.STRING(应为varchar列),但没有成功
请注意,我的应用程序运行良好;列类型使检查数据库和在戳数据库时发出临时SQL变得困难。可能是SQL Server特有的问题(可能您可以查看Hibernate SQL Server方言源以了解所使用的数据类型) 一般来说,使用
EnumType.ORDINAL
映射可能不是一个好主意,因为同样的原因,在普通Java代码中使用枚举序数也不是一个好主意:添加或删除枚举值可能很容易破坏代码,因为它可能会更改现有枚举值的序数。第6章第31项对此进行了更详细的讨论
我也发现了。我无法重现我正在使用的Hibernate版本的问题,但我猜测Hibernate不会将您的
enum
属性识别为@Enumerated
属性(MyEnum
是enum
,对吧?),并将其视为可序列化的。
我知道JPA规范说可以将@Basic
与枚举一起使用,但您尝试不使用它吗 这是一个愚蠢的用户错误。与我在问题中发布的内容相反,我弄乱了“极其简单”的映射。我没有将我的成员变量声明为MyEnum,而是使用以下内容:
@Basic
@Enumerated(EnumType.ORDINAL)
private Enum foo;
当然Hibernate必须存储二进制数据,因为我告诉它我想存储任意的枚举值。将foo的类型更改为MyEnum“修复”了该问题