我正在尝试在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),而是获得该字段的原始数据。
我该如何解决?
答案 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