休眠枚举映射
Posted
技术标签:
【中文标题】休眠枚举映射【英文标题】:Hibernate enum mapping 【发布时间】:2010-12-08 07:30:46 【问题描述】:我需要预先将未实现接口的枚举映射到现有数据库,该数据库使用@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 是否原生支持此功能?)。
【问题讨论】:
【参考方案1】: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)。在这里查看:
Enumerations in Hibernate
【讨论】:
如何设置默认值?我将以下元素添加到可以创建自定义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)。
【讨论】:
就我而言,我不知道枚举的类是什么。实例化A
时,Hibernate 需要选择 X, Y 枚举之一。
根据您的需要调整示例 UserType 实现应该不难。例如,除了存储值之外,您还可以存储类(例如 com.example.X.John 或 X.John,但您需要从 X 到 com.example.X 的映射)
意味着我需要一个自定义映射器(没有看到您指向 pastebin 的链接)。感谢您的回答。以上是关于休眠枚举映射的主要内容,如果未能解决你的问题,请参考以下文章