2009-12-13 46 views
16

我試圖在包含Enum作爲字段的HBM文件中創建一個類。添加枚舉作爲HBM中的類屬性

的HBM與此類似:

<class name="a.b.c.myObject" table="OBJECT" > 
     <property name="myEnum" column="EXAMPLE" type="a.b.c.myEnum" /> 
</class> 

,讓我們說,這是枚舉:

public enum myEnum{ 
    a, b, c; 
} 

的問題是,在DB我希望看到的是,字符串值枚舉(a,b或c),但是我得到了該字段的原始數據。

我該如何解決這個問題?

+1

參見http://stackoverflow.com/q/9839553/32453 – rogerdpack 2015-09-14 21:33:01

回答

0

你需要使用一個UserType有效地堅持認爲:https://www.hibernate.org/265.html

+0

這是一個相當過時的方法;創建所有這些額外的自定義類型是不必要 – ChssPly76 2009-12-13 20:00:07

+0

@ ChssPly76:你說得對。在這裏仍然使用JDK 1.4。 – cherouvim 2009-12-13 22:12:06

6

1)簡單的解決辦法:使用Hibernate Annotations而不是基於XML的映射。支持ENUM is built-in

@Entity 
public class MyObject { 
    @Enumerated(EnumType.STRING) 
    @Column(name="EXAMPLE") 
    private MyEnum myEnum; 
} 

2)如果您不能使用註解,你仍然可以使用他們的基於XML的映射提供EnumType。你需要在你的classpath適當hibernate-annotations.jar部署過程中但沒有編譯時依賴:

<class name="a.b.c.myObject" table="OBJECT" > 
    <property name="myEnum" column="EXAMPLE" type="org.hibernate.type.EnumType"/> 
</class> 
+0

我試過第二個選項,但它也是這樣。 – 2009-12-14 14:42:54

+0

「相同」是什麼意思? 「該領域的原始數據」是否被存儲在數據庫中意味着什麼?請注意,上面的「type」屬性必須指向一個實際的Hibernate類型;而不是像你在問題中指定的你的枚舉類。後者是非法的。 – ChssPly76 2009-12-14 16:23:06

+1

第二個例子似乎缺少告訴它使用哪個Enum類[?] – rogerdpack 2015-09-14 22:43:20

3

對於仍不清楚的原因,Hibernate的開發人員堅持不讓Hibernate的核心與預Java5的兼容,而且意味着沒有枚舉支持。當你試圖堅持一個枚舉字段時,它只是序列化它,並且你得到二進制數據。

如果要使用.hbm映射配置來保留枚舉,則必須爲要處理的每個枚舉類型創建和配置自定義UserType,這是乏味和令人煩惱的。 Hibernate documentation wiki有很多例子,其中很多例子似乎相互矛盾,其中一些甚至有效。

但是,如果您使用Hibernate註釋,您將獲得完整的java5支持,包括自動處理java5枚舉。這是一個真正的恥辱,你必須做一個或另一個。

+1

似乎這是可能的這些天... – rogerdpack 2015-09-14 22:43:37

14

下面是使用Hibernate的3.6.x的解決方案:

<class name="a.b.c.myObject" table="OBJECT"> 
    <property name="myEnum" column="EXAMPLE"> 
    <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">a.b.c.myEnum</param> 
    </type>  
    </property> 
</class> 
+0

因爲Hibernate 4.1.7使用條件查詢不再適用這種方法。由於此錯誤,無法更新到最新版本。 – djmj 2013-08-26 02:02:25

+0

這個效果很好,但不要嘗試使用「嵌套類」(另一個類中的枚舉),它似乎不起作用,但是正常的公共枚舉確實如此。 – rogerdpack 2015-09-14 22:53:26

0

只需編輯@Emmanuel布爾格答案,並添加其他<param>這樣的:

<class name="a.b.c.myObject" table="OBJECT"> 
    <property name="myEnum" column="EXAMPLE"> 
     <type name="org.hibernate.type.EnumType"> 
      <param name="enumClass">a.b.c.myEnum</param> 
      <param name="type">12</param> 
     </type>  
    </property> 
</class> 

12 equivilant到java.sql.Types.VARCHAR

+0

似乎你現在不需要指定「type」或「useNamed」(至少對於我來說Postgres它似乎默認爲正常的人類可讀...)。 – rogerdpack 2015-09-14 22:47:28

+0

哪種方法對性能更好? varchar或int序數?我必須對枚舉進行查詢。 – 2016-09-09 04:28:45

1

類似於@monim的回答,但更優雅的方式:

<class name="a.b.c.myObject" table="OBJECT"> 
    <property name="myEnum" column="EXAMPLE"> 
     <type name="org.hibernate.type.EnumType"> 
      <param name="enumClass">a.b.c.myEnum</param> 
      <param name="useNamed">true</param> 
     </type>  
    </property> 
</class>