2009-10-20 280 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