休眠枚举映射

2022-09-03 03:23:40

我需要将事先未实现接口的枚举映射到现有数据库,该数据库使用 .@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(); }
}

在这种情况下,应如何处理映射?持久化到数据库不会改变,因为实现接口的所有枚举都将具有不同的值,但我不确定应如何从数据库中检索对象(我是否需要自定义映射器,它将尝试使用指定的枚举类实例化枚举?休眠本身是否支持此功能?


答案 1

休眠提供映射枚举类型。例如org.hibernate.type.EnumType

package com.igalia.enumerates;

public enum Status {
   BUSY,
   AVAILABLE;
}

package com.igalia.entities;

class MyClass {
   private Status status;
}

然后,按如下方式执行休眠映射:

<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)。在这里检查:

休眠中的枚举


答案 2

可以创建自定义(例如,这个)并从映射中使用它UserType

<property name="type" not-null="true">
  <type name="at.molindo.util.hibernate.EnumUserType">
    <param name="enumClass">
      com.example.MyEnum
    </param>
  </type>
</property>

编辑:Hibernate带有它自己的EnumType(因为休眠注释中有3.2,因为休眠核心中有3.6 - 在撰写本文时不知道它在休眠注释中,但请参阅迭戈的答案)。