【问题标题】: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 是否原生支持此功能?)。

【问题讨论】:

    标签: java hibernate mapping enums


    【解决方案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 的链接)。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2017-05-28
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多