我需要事先将未实现接口的枚举映射到现有数据库,现有数据库使用@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本身是否支持此功能?)。
答案 0 :(得分: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)。在这里查看:
答案 1 :(得分: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-annotations中的3.2,因为hibernate-core中的3.6 - 在编写本文时并不知道它处于hibernate-annotations中,但请参阅Diego's answer )。