2009-10-20 273 views
16

我需要預先將未實現接口的枚舉映射到現有數據庫,該數據庫使用@Enumerated(EnumType.STRING)將枚舉存儲在與所有者類相同的表中。休眠枚舉映射

class A { 
    HasName name; 
} 

interface HasName { 
    String getName(); 
} 

enum X implements HasName { 
    John, Mary; 

    public String getName() { return this.name(); } 
} 

enum Y implements HasName { 
    Tom, Ann; 

    public String getName() { return this.name(); } 
} 

如何在這種情況下處理映射?堅持數據庫不會改變,因爲所有的實現接口的枚舉將有不同的值,但我不知道如何從數據庫中檢索對象(我是否需要一個自定義映射器,它會嘗試實例化使用指定的枚舉類枚舉枚舉?Hibernate本身支持這種功能嗎?)。

回答

7

它可以創建一個自定義UserType(如this one),並用它從你的映射

<property name="type" not-null="true"> 
    <type name="at.molindo.util.hibernate.EnumUserType"> 
    <param name="enumClass"> 
     com.example.MyEnum 
    </param> 
    </type> 
</property> 

編輯:Hibernate內置了它自己的EnumType(因爲在Hibernate的註解3.2,因爲在休眠核3.6 - 在編寫本文時不知道它是否處於休眠註釋狀態,但請參閱Diego's answer)。

+0

在我的情況下,我不知道枚舉的類將是什麼。當實例化'A'時,Hibernate需要選擇其中一個{X,Y}枚舉。 – dm3 2009-10-20 11:47:43

+0

根據需要調整示例UserType實現不應該很困難。例如,不是僅存儲該值,也可以存儲該類(例如,com.example.X.John或X.John,但是您需要從X到com.example.X的映射) – sfussenegger 2009-10-20 12:01:01

+0

表示I需要一個自定義的映射器(沒有看到你的鏈接到pastebin)。感謝你的回答。 – dm3 2009-10-20 12:19:42

50

Hibernate提供org.hibernate.type.EnumType來映射枚舉類型。例如,

package com.igalia.enumerates; 

public enum Status { 
    BUSY, 
    AVAILABLE; 
} 

package com.igalia.entities; 

class MyClass { 
    private Status status; 
} 

然後,做你的Hibernate映射如下:

<class name="MyClass"> 
    <id name="id"> 
     <generator class="native"/> 
    </id> 

    <property name="status"> 
     <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">com.igalia.enumerates.Status</param> 
     </type> 
    </property> 
</class> 

就是這樣。如果您更喜歡使用JPA批註而不是hbm.xml,請使用@Enumerated(EnumType.STRING)。檢查它在這裏:

Enumerations in Hibernate

+0

你如何設置默認值?我添加了下面的元素到但那對我沒有用: Timo 2011-04-27 18:57:03

+1

@valmar您可以在類級別初始化* status *(或在其構造函數中執行)。例如,'私人狀態狀態= Status.BUSY;' – 2011-05-16 12:04:39