Добавление перечисления в качестве свойства класса в HBM - программирование
Подтвердить что ты не робот

Добавление перечисления в качестве свойства класса в HBM

Я пытаюсь создать класс в HBM файле, который содержит Enum в качестве поля.

HBM похож на этот:

<class name="a.b.c.myObject" table="OBJECT" >
       <property name="myEnum" column="EXAMPLE" type="a.b.c.myEnum" />
</class>

и скажем, что это Enum:

public enum myEnum{
    a, b, c;
}

Проблема в том, что в БД я ожидал увидеть значение String этого перечисления (a, b или c), но вместо этого я получил необработанные данные этого поля.

Как я могу это решить?

4b9b3361

Ответ 1

Вот решение с Hibernate 3.6.x:

<class name="a.b.c.myObject" table="OBJECT">
  <property name="myEnum" column="EXAMPLE">
    <type name="org.hibernate.type.EnumType">
      <param name="enumClass">a.b.c.myEnum</param>
    </type>       
  </property>
</class>

Ответ 2

1) Простое решение: используйте Hibernate Annotations вместо сопоставлений на основе XML. Поддержка Enum встроена:

@Entity
public class MyObject {
  @Enumerated(EnumType.STRING)
  @Column(name="EXAMPLE")
  private MyEnum myEnum;
}

2) Если вы не можете использовать аннотации, вы все равно можете использовать EnumType, который они предоставляют, в сопоставлениях на основе XML. Вам нужно иметь соответствующий hibernate-annotations.jar в вашем пути к классам во время развертывания, но нет зависимости от времени компиляции:

<class name="a.b.c.myObject" table="OBJECT" >
  <property name="myEnum" column="EXAMPLE" type="org.hibernate.type.EnumType"/>
</class>

Ответ 3

По причинам, которые остаются неясными, разработчики Hibernate настаивают на том, чтобы поддерживать совместимость ядра Hibernate с pre-Java5, а это означает отсутствие поддержки перечислений. Когда вы пытаетесь сохранить поле Enum, оно просто сериализует его, и вы получаете двоичные данные.

Если вы хотите сохранить перечисления с использованием конфигурации отображения .hbm, вам необходимо создать и настроить пользовательский UserType для каждого типа перечисления, который вы хотите обработать, что является утомительным и раздражающим. Hibernate documentation wiki имеет множество примеров, многие из которых, кажется, противоречат друг другу, и некоторые из них даже работают.

Если вы используете аннотации Hibernate, вы получаете полную поддержку java5, включая автоматическую обработку перечислений java5. Это просто настоящий позор, что вы должны сделать то или другое.

Ответ 4

Как и @monim, но более элегантный способ:

<class name="a.b.c.myObject" table="OBJECT">
    <property name="myEnum" column="EXAMPLE">
        <type name="org.hibernate.type.EnumType">
            <param name="enumClass">a.b.c.myEnum</param>
            <param name="useNamed">true</param>
        </type>       
    </property>
</class>

Ответ 6

Просто отредактируйте @Emmanuel Bourg и добавьте еще один <param> вот так:

<class name="a.b.c.myObject" table="OBJECT">
    <property name="myEnum" column="EXAMPLE">
        <type name="org.hibernate.type.EnumType">
            <param name="enumClass">a.b.c.myEnum</param>
            <param name="type">12</param>
        </type>       
    </property>
</class>

12 эквивалентно java.sql.Types.VARCHAR