[英]How to map mysql enum type with hypen to JPA entity?
mysql sakila.film
中有一個表,其字段rating
為enum('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.