Это то, что Преобразователи атрибутов JPA предназначены для достижения цели.
Сначала вы захотите сопоставить элементы Java enum
со строками, найденными в базе данных.и предоставьте метод поиска для преобразования строки в элемент:
public enum Rating {
G("G"), // the string arguments should exactly match what's in the database.
PG("PG"),
PG13("PG-13"),
R("R"),
NC17("NC-17");
private static final Map<String, Rating> LOOKUP = Arrays.stream(values())
.collect(Collectors.toMap(Rating::getRating, Function.identity()));
private final String rating;
Rating(final String rating) {
this.rating = rating;
}
public String getRating() {
return rating;
}
public Rating fromString(final String rating) {
// You may want to include handling for the case where the given string
// doesn't map to anything - implementation is up to you.
return LOOKUP.get(rating);
}
}
Далее вам понадобится класс, который реализует javax.persistence.AttributeConverter
:
public static class RatingConverter implements AttributeConverter<Rating, String> {
@Override
public String convertToDatabaseColumn(final Rating attribute) {
return attribute.getRating();
}
@Override
public Rating convertToEntityAttribute(final String dbData) {
return Rating.fromString(dbData);
}
}
Отсюда вынеобходимо решить, должен ли этот преобразователь всегда применяться (звучит так, как, вероятно, должно быть), или нет.
Если вы хотите, чтобы он всегда использовался без дальнейшей настройки, аннотируйте класс преобразователя с помощью@javax.persistence.Converter(autoApply = true)
.
Если вы хотите выбрать, когда будете использовать конвертер, вам нужно будет добавить аннотацию @javax.persistence.Convert(converter = RatingConverter.class)
к атрибуту Rating каждого объекта JPA, который в этом нуждается.
Лично я обычно вкладываю конвертеры как статический класс в класс, который они конвертируют, но вам не нужно этого делать, если вы предпочитаете хранить их отдельно.