簡體   English   中英

Hibernate枚舉映射

[英]Hibernate enum mapping

我需要事先將未實現接口的枚舉映射到現有數據庫,現有數據庫使用@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本身是否支持此功能?)。

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)。 在這里查看:

Hibernate中的枚舉

可以創建自定義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在hibernate-annotations中,因為hibernate-core中的3.6 - 在編寫本文時並不知道它是在hibernate-annotations中,但是看到Diego的答案 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM