Несоответствие Spring JpaRepository ENUM

Мой класс enum выглядит следующим образом:

public enum Sex {

    MALE('M'), FEMALE('F'), UNKNOWN('U');

    char name;

    Sex(char name) {
        this.name = name;
    }

    public char getName() {
        return name;
    }
}

Моя схема базы данных H2 для атрибута выглядит следующим образом:

sex CHAR(1),

Мой модельный класс:

@Column
@NotNull
@Enumerated(EnumType.STRING)
private Sex sex;

Когда я пытаюсь заполнить свои модели через JpaRepository, я получаю следующее исключение: java.lang.IllegalArgumentException: No enum constant com.awesome.enumeration.Sex.M

Что мешает мне сопоставить мою БД с перечислением?

Кстати: термин здесь скорее gender

Kawu 20.12.2019 05:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
1 586
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Он пытается найти Enum с именем M. Ваши перечисления MALE, FEMALE и UNKNOWN. Вы можете изменить свое перечисление на M, F, U

В идеале я хочу, чтобы мои перечисления были MALE, FEMALE и т. д., но отображались на символы при сохранении в БД. Как я могу это сделать?

john 15.05.2019 16:38
Ответ принят как подходящий

Вы можете написать собственный конвертер для вашего перечисления:

@Converter
public class SexConverter implements AttributeConverter<Sex, Character> {


    @Override
    public Character convertToDatabaseColumn(Sex sex) {
        return sex.getName();
    }

    @Override
    public Sex convertToEntityAttribute(Character dbData) {
        return Sex.getByName(dbData);
    }
}

Затем в вашей сущности:

@Entity
public class TestEntity {

    @Column
    @NotNull
    @Convert(converter = SexConverter.class)
    private Sex sex;
}

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

public enum Sex {

    MALE('M'), FEMALE('F'), UNKNOWN('U');

    char name;

    Sex(char name) {
        this.name = name;
    }

    public char getName() {
        return name;
    }

    public static Sex getByName(char name) {
        return Arrays.stream(Sex.values())
                .filter(sex -> sex.getName() == name)
                .findFirst()
                .orElse(UNKNOWN);
    }
}

Другие вопросы по теме