如何在Hibernate中映射一组枚举类型?

时间:2009-07-14 15:08:23

标签: java hibernate orm nhibernate-mapping

在hibernate中,是否可以将类的映射定义为一组枚举?

我已经能够找到如何定义集合映射的示例,我已经能够找到有关如何映射枚举的单独示例,但我无法弄清楚如何为类定义枚举。 / p>

有谁能请我提供一个例子?

这是在现有应用程序之上构建的,因此我无法更改数据库架构。

这是我想要建模的关系。 Wicket是普通类,WicketType是Java Enum。

+----------------+    +------------+    +------------+
| Wicket         |    | Ref Table  |    | WicketType |
+----------------+    +------------+    +------------+
| INT     | W_ID |    |            |    | W_TypeId   |
| ....    |      | FK | W_ID       | FK | WicketType |
| INT     | TYPE |----| W_TypeId   |----|            |
+----------------+    +------------+    +------------+

再次感谢

3 个答案:

答案 0 :(得分:4)

更简单的方法是

<typedef name="WicketTypeType" class="org.hibernate.type.EnumType">
  <param name="enumClass">Wicket</param>
  <param name="type">12</param>
</typedef>

<class  name="Wicket"...

    <set name="WicketType" table="Ref Table">
        <key column="W_ID" />
        <element column="W_TypeID" type="WicketTypeType"/>
    </set>

...
</class>

答案 1 :(得分:3)

下面的示例代码显示了如何通过注释实现您的目标。

@Entity
@Table (name = "wicket")
public class Wicket {

    ...
    ...

    private List<WicketType> wicketTypes = new ArrayList<WicketType>();

    @CollectionOfElements(fetch=FetchType.EAGER)
    @JoinTable(
            name="wicket_wicket_types", // ref table.
            joinColumns = {@JoinColumn(name="wicket_id")}
    )
    @Column(name="wicket_type_id")
    public List<WicketType> getWicketTypes() {
        return this.wicketTypes;
    }

    public void setWicketTypes(List<WicketType> wicketTypes) {
        this.wicketTypes = wicketTypes;
    }
    ...
    ...
}

WicketType是标准的Java 5 Enum,其枚举声明的顺序和序数与wicket_type_id表中的顺序和列(wicket_type)值匹配。

public enum WicketType {
   WICKET_TYPE1, WICKET_TYPE2 ...
}

答案 2 :(得分:2)

this不能满足您的需求吗?

为了详细说明轻率的初始响应,该引用提供了一种使用枚举的序数来映射枚举的方法。

在这种情况下,它实际上比它看起来更简单,因为你在一个集合中托管枚举,你需要为WicketType提供一个IntEnumUserType子类型的访问器,超类型将负责映射顺序到实例。

package test;

public class WicketTypeState extends IntEnumUserType<WicketType> {
    private WicketType wicketType;

public WicketTypeState() {
    // we must give the values of the enum to the parent.
    super(WicketType.class, WicketType.values());
}

    public WicketType getWicketType() {
        return wicketType;
    }

    public void setWicketType(final WicketType wicketType) {
        this.wicketType = wicketType;
    }
}

定义枚举表的映射:

<hibernate-mapping package="test">  
  <class name="Wicket" table="Wicket">
    <id name="id" column="ID"/>
    <set name="wicketTypes" table="WicketType" inverse="true">
      <key column="ID"/>
      <one-to-many class="test.WicketTypeState"/>
    </set>
  </class>
</hibernate-mapping>

然后,对于具有枚举集的类型,请为该属性定义集映射:

<hibernate-mapping package="test">
  <class name="WicketTypeState" lazy="true" table="WicketType">
    <id name="WicketType" 
      type="test.WicketTypeState"/>
  </class>
</hibernate-mapping>

这在我的盒子上工作(tm),如果您需要更多信息,请告诉我。