休眠枚举映射

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

【讨论】:

如何设置默认值?我将以下元素添加到 但这对我不起作用: @valmar 您可以在类级别初始化 status (或在其构造函数中进行初始化)。例如,'private Status status = Status.BUSY;'【参考方案2】:

可以创建自定义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 的链接)。感谢您的回答。

以上是关于休眠枚举映射的主要内容,如果未能解决你的问题,请参考以下文章

Java 5枚举休眠映射

枚举类型休眠 3

proxmox映射硬盘的休眠控制

datetimeoffset 休眠映射

在休眠中读写通用枚举

如何使用类属性映射休眠中的列?