Отображение перечисления гибернации
Мне нужно отобразить перечисления, которые ранее не реализовали интерфейс в существующей базе данных, которая хранит перечисления в той же таблице, что и класс владельца, используя @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 эту функциональность?).
Ответы
Ответ 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). Проверьте это здесь:
Перечисления в спящем режиме