Hibernate枚举映射

dm3*_*dm3 16 java mapping enums hibernate

我需要事先将未实现接口的枚举映射到现有数据库,现有数据库使用枚举将枚举存储在与所有者类相同的表中@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(); }
}
Run Code Online (Sandbox Code Playgroud)

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

Die*_*ino 50

Hibernate提供org.hibernate.type.EnumType映射枚举类型.例如,

package com.igalia.enumerates;

public enum Status {
   BUSY,
   AVAILABLE;
}

package com.igalia.entities;

class MyClass {
   private Status status;
}
Run Code Online (Sandbox Code Playgroud)

然后,按如下方式进行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>
Run Code Online (Sandbox Code Playgroud)

就是这样.如果您更喜欢使用JPA注释而不是hbm.xml,请使用@Enumerated(EnumType.STRING).在这里查看:

Hibernate中的枚举


sfu*_*ger 7

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

<property name="type" not-null="true">
  <type name="at.molindo.util.hibernate.EnumUserType">
    <param name="enumClass">
      com.example.MyEnum
    </param>
  </type>
</property>
Run Code Online (Sandbox Code Playgroud)

编辑:Hibernate附带了它自己的EnumType(因为3.2在hibernate-annotations中,因为hibernate-core中的3.6 - 在编写本文时并不知道它是在hibernate-annotations中,但是看到Diego的答案).