Enum в Hibernate, сохраняется как enum - PullRequest
38 голосов
/ 29 января 2010

В моей базе данных MySQL есть столбец "гендерное перечисление (" мужской "," женский ")"

Я создал свой enum "com.mydomain.myapp.enums.Gender", а в моем Person объекте я определен как "Пол".

Теперь я бы хотел сохранить тип enum в моей базе данных MySQL, но при запуске приложения я получаю:

Неправильный тип столбца в MyApp.Person для столбца Gender. Найдено: enum, ожидается: integer

Почему это? Это будет эквивалентно тому, как если бы я аннотировал свой «пол» с помощью «@Enumerated (EnumType.ORDINAL)», чего у меня нет. Кажется, что EnumType может быть только ORDINAL или STRING, так как мне указать, что он должен обрабатывать поле как перечисление, а не как int? (не так уж много различий, но достаточно, чтобы расстраиваться из-за этого.)

Ответы [ 5 ]

26 голосов
/ 29 января 2010

Насколько я понимаю, тип перечисления MySQL очень проприетарный и не очень хорошо поддерживается Hibernate, см. этот комментарий от Гэвина Кинга (эта проблема немного отличается, но это не важная часть).

Итак, я действительно думаю, что вам придется использовать свой собственный UsereType, и я бы рекомендовал использовать Гибкое решение - рабочая версия из Java 5 EnumUserType (см. пример Java 5 Enums Persistence с Hibernate в Appfuse).

Лично я бы просто забыл идею использовать перечисление MySQL, я не уверен, что «преимущества» того стоят (см. этот ответ для более подробной информации).

24 голосов
/ 26 апреля 2010

Если вы дадите Hibernate определение столбца, он не будет пытаться угадать его:

@Column(columnDefinition = "enum('MALE','FEMALE')")
@Enumerated(EnumType.STRING)
private Gender gender;

Если вы по какой-либо причине не используете Hibernate для создания схемы, вам даже не нужно предоставлять реальные значения для columnDefinition. Таким образом, вы удаляете экземпляр, в котором вам нужно синхронизировать значения. Просто синхронизируйте перечисление Java и скрипт Liquibase или SQL:

@Column(columnDefinition = "enum('DUMMY')")
@Enumerated(EnumType.STRING)
private ManyValuedEnum manyValuedEnum;
17 голосов
/ 24 февраля 2010

Попробуйте использовать @Enumerated (EnumType.STRING) и определить свой enum следующим образом:

enum Gender {
  male,
  female
}

Обратите внимание на значения в нижнем регистре.

Это будет работать по крайней мере с колонками VARCHAR. Он будет хранить перечисление в виде строки «мужской» или «женский».

5 голосов
/ 25 апреля 2012

не уверен, почему его нет в документации Hibernate но вы можете сделать это

<property name="type" column="type" not-null="true">
    <type name="org.hibernate.type.EnumType">
        <param name="enumClass">com.a.b.MyEnum</param>
        <param name="type">12</param>
        <!-- 12 is java.sql.Types.VARCHAR -->
    </type> 
</property>
4 голосов
/ 15 сентября 2011

Не для этого случая, но если кто-то использует сопоставление XML:

<property name="state" column="state" not-null="true">
  <type name="org.hibernate.type.EnumType">
    <param name="enumClass">com.myorg.persistence.data.State</param>
  </type>
</property>

Тип столбца базы данных должен быть числовым, например, tinyint в mysql, чтобы сделать возможным чтение порядковых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...