Добавление перечисления как свойства класса в 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;
}

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

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

17 голосов | спросил Avi Y 13 SunEurope/Moscow2009-12-13T17:32:16+03:00Europe/Moscow12bEurope/MoscowSun, 13 Dec 2009 17:32:16 +0300 2009, 17:32:16

6 ответов


0

Вот решение с 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>
ответил Emmanuel Bourg 24 J0000006Europe/Moscow 2011, 19:31:08
0

1) Простое решение: используйте аннотации Hibernate вместо сопоставлений на основе 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>
ответил ChssPly76 13 SunEurope/Moscow2009-12-13T22:58:05+03:00Europe/Moscow12bEurope/MoscowSun, 13 Dec 2009 22:58:05 +0300 2009, 22:58:05
0

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

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

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

ответил skaffman 13 SunEurope/Moscow2009-12-13T23:03:06+03:00Europe/Moscow12bEurope/MoscowSun, 13 Dec 2009 23:03:06 +0300 2009, 23:03:06
0

Просто отредактируйте ответ @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

ответил monim 1 J000000Tuesday14 2014, 11:08:47
0

Похоже на ответ @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>
ответил eitann 27 Mayam15 2015, 11:31:16
0

Вам нужно использовать UserType, чтобы эффективно сохранять это: https://www.hibernate.org/265.html

ответил cherouvim 13 SunEurope/Moscow2009-12-13T17:38:19+03:00Europe/Moscow12bEurope/MoscowSun, 13 Dec 2009 17:38:19 +0300 2009, 17:38:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132