簡體   English   中英

如何將 map mysql 枚舉類型與 JPA 實體連字符?

[英]How to map mysql enum type with hypen to JPA entity?

mysql sakila.film中有一個表,其字段ratingenum('G','PG','PG-13','R','NC-17')

我正在嘗試 map 在 JPA 實體中使用enum類型和@Enumerated(EnumType.STRING)但不能這樣做,因為 java 不允許使用連字符。 也無法更改或更新表,因為它有大量數據並給出錯誤 - “數據被截斷為列 'rating'”

如何進行?

這類事情是JPA 屬性轉換器旨在幫助實現的。

首先,您需要 map 您的 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的 class :

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)注釋您的轉換器 class 。

如果要選擇何時使用轉換器,則需要在每個需要它的 JPA 實體的 Rating 屬性中添加注解@javax.persistence.Convert(converter = RatingConverter.class)

就我個人而言,我通常將轉換器嵌套為 static class 內部的 class ,但如果您希望將它們分開,則不必這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM