在HBM中添加枚举作为类属性

时间:2009-12-13 14:32:17

标签: hibernate enums hibernate-mapping hbm

我正在尝试在HBM文件中创建一个包含Enum作为字段的类。

HBM与此类似:

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

让我们说这是Enum:

public enum myEnum{
    a, b, c;
}

问题是在DB中我希望看到该枚举的字符串值(a,b或c),而是获得该字段的原始数据。

我该如何解决?

6 个答案:

答案 0 :(得分:15)

以下是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>

答案 1 :(得分:6)

1)简单的解决方案:使用Hibernate Annotations而不是基于XML的映射。枚举支持is built-in

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

2)如果您不能使用注释,您仍然可以使用它们在基于XML的映射中提供的EnumType。在部署期间,您需要在类路径中具有适当的hibernate-annotations.jar,但是没有编译时依赖性:

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

答案 2 :(得分:3)

由于原因仍然模糊不清,Hibernate开发人员坚持要求Hibernate核心与Java5之前版本兼容,这意味着没有枚举支持。当您尝试保留Enum字段时,它只是对其进行序列化,然后您将获得二进制数据。

如果要使用.hbm映射配置保留枚举,则必须为要处理的每个枚举类型创建和配置自定义UserType,这很乏味且烦人。 Hibernate documentation wiki有很多例子,其中许多似乎相互矛盾,其中一些甚至有效。

但是,如果使用Hibernate注释,则会获得完整的java5支持,包括自动处理java5枚举。你必须要做其中一件事真是太遗憾了。

答案 3 :(得分:3)

只需编辑@Emmanuel Bourg回答并添加另一个<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等同于java.sql.Types.VARCHAR

答案 4 :(得分:3)

类似于@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>

答案 5 :(得分:0)

您需要使用UserType来有效地保持这种效果: https://www.hibernate.org/265.html