Как отобразить тип перечисления mysql с помощью hypen к сущности JPA? - PullRequest
0 голосов
/ 25 сентября 2019

В mysql sakila.film есть таблица с полем rating типа enum('G','PG','PG-13','R','NC-17').

Я пытаюсь отобразить это в JPA-сущности, используя типы enum и @Enumerated(EnumType.STRING), но неспособный, поскольку перечисление java не допускает дефис.Невозможно изменить или обновить таблицу, так как она содержит много данных и выдает ошибку - «Данные усечены для столбца« рейтинг »»

Как продолжить?

1 Ответ

1 голос
/ 25 сентября 2019

Это то, что Преобразователи атрибутов 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, который в этом нуждается.

Лично я обычно вкладываю конвертеры как статический класс в класс, который они конвертируют, но вам не нужно этого делать, если вы предпочитаете хранить их отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...