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

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

Я создал свое перечисление "com.mydomain.myapp.enums. Пол", и в моем Person объект я определяюсь "Гендерный пол".

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

Неправильный тип столбца в MyApp. Человек для столбца Gender. Найденный: перечисление, ожидаемое: целое число

Почему это? Это было бы эквивалентом, как будто я аннотировал свой "Гендерный пол" "@Enumerated (EnumType. ПОРЯДКОВЫЙ)", который я не имею. EnumType, кажется, только может быть или ПОРЯДКОВЫМ или СТРОКА, поэтому как я указываю, что он должен рассматривать поле как перечисление, не как интервал? (не, что существует много различия, но достаточно чтобы оно было нарушено об этом.)

39
задан Pascal Thivent 1 May 2010 в 00:38
поделиться

3 ответа

-

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

Итак, я на самом деле думаю, что вам придется использовать свой собственный user user use , и я бы порекомендовал использовать гибкое решение - рабочая версия из Java 5 Enumusertype (см. AppFuse's Java 5 Enums на примере с гибернатом .

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

27
ответ дан 27 November 2019 в 02:31
поделиться

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

enum Gender {
  male,
  female
}

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

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

17
ответ дан 27 November 2019 в 02:31
поделиться

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

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

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

@Column(columnDefinition = "enum('DUMMY')")
@Enumerated(EnumType.STRING)
private ManyValuedEnum manyValuedEnum;
24
ответ дан 27 November 2019 в 02:31
поделиться
Другие вопросы по тегам:

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