18

我正在尝试在 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;
}

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

我该如何解决?

4

6 回答 6

17

这是 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>
于 2011-06-24T15:31:08.020 回答
8

类似于@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>
于 2015-05-27T08:31:16.487 回答
7

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

@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>
于 2009-12-13T19:58:05.947 回答
6

只需编辑@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

于 2014-07-01T07:08:47.233 回答
3

出于不明原因,Hibernate 开发人员坚持保持 Hibernate 内核与 Java5 之前的版本兼容,这意味着不支持枚举。当您尝试持久化 Enum 字段时,它只是对其进行序列化,然后您将获得二进制数据。

如果要使用 .hbm 映射配置来持久化枚举,则必须为UserType要处理的每种枚举类型创建和配置自定义,这既乏味又烦人。Hibernate 文档 wiki有很多示例,其中许多似乎相互矛盾,其中一些甚至有效。

但是,如果您使用 Hibernate 注释,您将获得完整的 java5 支持,包括自动处理 java5 枚举。您必须做其中一个,这真是太可惜了。

于 2009-12-13T20:03:06.607 回答
0

您需要使用 UserType 来有效地保留它:https://www.hibernate.org/265.html

于 2009-12-13T14:38:19.580 回答