2010-04-11 34 views
2

Hibernates使用JPA @Enumerated註釋生成VARBINARY列。我正在使用SQL Server 2005 w/JTDS驅動程序。映射很簡單:Hibernates使用JPA @Enumerated註釋生成VARBINARY列

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

我會期望Hibernate生成一個整數列?我也試過EnumType.STRING(期待一個varchar列)沒有成功。

請注意,我的應用程序工作正常;列類型使得很難檢查數據庫,並在數據庫戳時發出特別的SQL。

回答

1

這是一個愚蠢的用戶錯誤。與我在我的問題中發佈的內容相反,我搞砸了「污垢簡單」映射。相反,說出我的成員變量MyEnum的,我不是有這個:

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

當然好了休眠不得不存儲二進制數據,因爲我告訴了我想要存儲任意枚舉值。將foo的類型更改爲MyEnum「修復」了問題。

1

可能是一個特定於SQL Server的問題(也許你可以看一下Hibernate SQL Server方言源以找出使用的數據類型)。

一般來說,使用EnumType.ORDINAL映射可能不是一個好主意,因爲在普通Java代碼中使用枚舉序列並不是一個好主意:添加或刪除枚舉值可能很容易破壞您的代碼,因爲它可能會改變現有枚舉值的序數。這在Effective Java, 2nd Ed第6章第31項中有更詳細的討論。

我也發現了further arguments for this from the DB perspective

0

我無法重現該問題與Hibernate的版本我用,但我的猜測是,Hibernate不認識你enum財產作爲財產@EnumeratedMyEnumenum,對吧?),並把它當作Serializable。 我知道JPA規範說可以使用帶枚舉的@Basic,但是你沒有嘗試?