Подтвердить что ты не робот

Отображение перечисления гибернации

Мне нужно отобразить перечисления, которые ранее не реализовали интерфейс в существующей базе данных, которая хранит перечисления в той же таблице, что и класс владельца, используя @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(); }
}

Как должно обрабатываться отображение в этом случае? Сохранение базы данных не изменяется, поскольку все перечисления, реализующие интерфейс, будут иметь разные значения, но я не уверен, как объекты должны быть извлечены из БД (нужен ли мне настраиваемый сопоставитель, который попытается создать экземпляр enum, используя указанные классы enum? Поддерживает ли Hibernate эту функциональность?).

4b9b3361

Ответ 1

Возможно создать пользовательский UserType (например этот) и использовать его из ваших сопоставлений

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

EDIT: Hibernate поставляется с собственным EnumType (начиная с 3.2 в hibernate-аннотациях, начиная с 3.6 в hibernate-core - не знал о том, что он был в hibernate-аннотациях на момент написания, но см. Ответ Диего).

Ответ 2

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). Проверьте это здесь:

Перечисления в спящем режиме