Hibernate使用JPA @Enumerated注释生成VARBINARY列

时间:2010-04-11 17:14:30

标签: java hibernate orm jpa

Hibernates正在使用JPA @Enumerated注释生成VARBINARY列。我正在使用带有JTDS驱动程序的SQL Server 2005。映射很简单:

@Basic
@Enumerated(EnumType.ORDINAL)
private MyEnum foo;

我原本希望Hibernate生成一个整数列?我也尝试过EnumType.STRING(期望varchar列)没有成功。

请注意,我的应用运行正常;列类型使得检查数据库变得困难,并且在戳到数据库时发出adhoc SQL。

3 个答案:

答案 0 :(得分:1)

可能是SQL Server特定的问题(也许您可以查看Hibernate SQL Server方言源以找出所使用的数据类型)。

通常,使用EnumType.ORDINAL映射可能不是一个好主意,因为在普通Java代码中使用枚举不是一个好主意:添加或删除枚举值可能很容易破坏您的代码,因为它可能会更改现有枚举值的序数。这在Effective Java, 2nd Ed第6章第31项中有更详细的讨论。

我还找到了further arguments for this from the DB perspective

答案 1 :(得分:1)

这是一个愚蠢的用户错误。与我在问题中发布的内容相反,我搞砸了“污垢简单”的映射。我没有将我的成员变量声明为MyEnum,而是将其改为:

@Basic
@Enumerated(EnumType.ORDINAL)
private Enum foo;

当然Hibernate必须存储二进制数据,因为我告诉它我想存储任意枚举值。将foo的类型更改为MyEnum“修复”了问题。

答案 2 :(得分:0)

我无法重现我正在使用的Hibernate版本的问题,但我的猜测是Hibernate无法将enum属性识别为@Enumerated属性(MyEnumenum,对吗?)并将其视为Serializable。 我知道JPA规范说可以将@Basic与枚举一起使用,但是你可以试试吗?