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

Перечисление в спящем режиме, сохраняющееся как перечисление

В моей базе данных MySQL есть столбец "gender enum (" мужчина "," женщина ")"

Я создал свой enum "com.mydomain.myapp.enums.Gender", и в моем Person сущности я определил "Гендерный пол".

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

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

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

4b9b3361

Ответ 1

Я понимаю, что тип перечислимого типа MySQL очень проприетарен и не поддерживается Hibernate, см. этот комментарий от Gavin King (этот связанный с этим вопрос немного отличается, но это не важная часть).

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

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

Ответ 2

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

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

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

@Column(columnDefinition = "enum('DUMMY')")
@Enumerated(EnumType.STRING)
private ManyValuedEnum manyValuedEnum;

Ответ 3

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

enum Gender {
  male,
  female
}

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

Это будет работать, по крайней мере, с столбцами VARCHAR. Он будет хранить перечисление как строку "мужчина" или "женщина".

Ответ 4

не уверен, почему это не в документации 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>

Ответ 5

Не для этого случая, но если кто-то использует 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, чтобы сделать возможным чтение порядковых значений.