Перечисление в спящем режиме, сохраняющееся как перечисление
В моей базе данных MySQL есть столбец "gender enum (" мужчина "," женщина ")"
Я создал свой enum "com.mydomain.myapp.enums.Gender", и в моем Person
сущности я определил "Гендерный пол".
Теперь я хочу сохранить тип перечисления в моей базе данных MySQL, но когда я запускаю свое приложение, я получаю:
Неверный тип столбца в MyApp.Person для столбца Пол. Найдено: enum, expected: integer
Почему это? Это было бы эквивалентно, как если бы я аннотировал мой "Гендерный пол" с "@Enumerated (EnumType.ORDINAL)", которого у меня нет. EnumType, похоже, может быть либо ORDINAL, либо STRING, поэтому как я могу указать, что он должен обрабатывать поле как перечисление, а не как int? (не то, чтобы было много разницы, но достаточно, чтобы это расстраивалось из-за этого.)
Ответы
Ответ 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, чтобы сделать возможным чтение порядковых значений.