Мой класс 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
Что мешает мне сопоставить мою БД с перечислением?




Он пытается найти Enum с именем M. Ваши перечисления MALE, FEMALE и UNKNOWN. Вы можете изменить свое перечисление на M, F, U
В идеале я хочу, чтобы мои перечисления были MALE, FEMALE и т. д., но отображались на символы при сохранении в БД. Как я могу это сделать?
Вы можете написать собственный конвертер для вашего перечисления:
@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);
}
}
Кстати: термин здесь скорее
gender