Hibernate @Enumerated, кажется, игнорируется

У меня есть класс Person, сопоставленный с аннотациями с перечислением Sex, относящимся к полу, если это мужчина или женщина. Давайте посмотрим:

@Entity
@Table(name = "PERSON")
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Enumerated(EnumType.STRING)
    @Column(name = "SEX")
    private Sex sex;

    private enum Sex {
        M,
        F;
    } 

    // Getters, setters & constructors
}

Когда я тестирую получение всех строк из базы данных MySQL, это работает, и сопоставление правильное.

База данных уже предопределена, вот определение столбца:

`SEX` enum('M','F') NOT NULL

Однако ошибка возникает, когда я настраиваю Hibernate с помощью hibernate.hbm2ddl.auto=validate:

found [enum (Types#CHAR)], but expecting [varchar(255) (Types#VARCHAR)]

Ошибка немного отличается (expecting [integer (Types#INTEGER)]), когда я использую EnumType.ORDINAL или вообще не использую @Enumerated.

Что я делаю неправильно?


person Nikolas Charalambidis    schedule 01.07.2017    source источник


Ответы (1)


попробуйте добавить определение столбца

@Enumerated(EnumType.STRING)
@Column(name = "SEX" , columnDefinition="ENUM('M','S')" ,nullable = false )
private Sex sex;

проверка спящего режима, проверка типов, длина .... поскольку у вас есть это на уровне БД, валидатор считает, что это другой тип.

Я не видел этого с Oracle , но с MySql это может быть

person xyz    schedule 01.07.2017
comment
Он многословен и повторяет объявление enum в двух местах кода Java. По этой цене я бы не использовал в MySQL перечисление как тип, а varchar, и добавил бы ограничение на этот столбец, чтобы указать допустимые значения. - person davidxxx; 01.07.2017
comment
Из-за того, что вы сопоставляете значение формы db с enum.in db, вы можете обновить это значение, и ваш код перестанет работать. - person xyz; 01.07.2017
comment
Простое добавление @Column(columnDefinition = "enum"), кажется, помогает с H2. - person Didier Breedt; 21.07.2018
comment
Добавление @Column(columnDefinition = enum) помогает и в случае с MySQL. - person Ahmad Khundaqji; 30.05.2019
comment
Postgresql не любит @Column(columnDefinition = enum). любой аналог? - person Andrew; 26.07.2020
comment
Postgresql любит @Column(columnDefinition = <name_of_type>) например @Column(columnDefinition = sex) - person Jan Dev; 01.07.2021