В моей базе данных MySQL существует столбец "гендерное перечисление ('штекер', 'розетка')"
Я создал свое перечисление "com.mydomain.myapp.enums. Пол", и в моем Person
объект я определяюсь "Гендерный пол".
Теперь я хотел бы сохранить перечислимый тип в своей базе данных MySQL, но когда я запускаю свое приложение, я добираюсь:
Неправильный тип столбца в MyApp. Человек для столбца Gender. Найденный: перечисление, ожидаемое: целое число
Почему это? Это было бы эквивалентом, как будто я аннотировал свой "Гендерный пол" "@Enumerated (EnumType. ПОРЯДКОВЫЙ)", который я не имею. EnumType, кажется, только может быть или ПОРЯДКОВЫМ или СТРОКА, поэтому как я указываю, что он должен рассматривать поле как перечисление, не как интервал? (не, что существует много различия, но достаточно чтобы оно было нарушено об этом.)
Мое понимание в том, что тип MySQL Enum очень проприетан и не очень хорошо поддерживается гибернатом, см. Этот комментарий из Гавина Кинг (этот родственный вопрос немного отличается, но это не важная часть).
Итак, я на самом деле думаю, что вам придется использовать свой собственный user user use
, и я бы порекомендовал использовать гибкое решение - рабочая версия из Java 5 Enumusertype (см. AppFuse's Java 5 Enums на примере с гибернатом .
Лично, я бы просто забыл идею использовать MySQL Enum, я не убежден, что «преимущества» стоят этого (см. Этот ответ для более подробной информации).
Попробуйте использовать @Enumerated (EnumType.STRING) и определите ваше перечисление следующим образом
enum Gender {
male,
female
}
Обратите внимание на значения в нижнем регистре.
Это будет работать как минимум со столбцами VARCHAR. Он будет хранить enum как строку «мужчина» или «женщина».
Если вы дадите 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;