需求背景
對於一些數據庫字段,雖然它只有幾種有限的內容種類,但它的格式並不完全遵守SCREAMING_SNAKE_CASE,所以就需要進行一些設置來保證Spring Data JPA映射正確的值。
實現方式
枚舉類Color:
public enum Color {
RED,
GREEN,
BLUE
}
默認的實現是映射枚舉值的ORDINAL值
@Entity
public class Entity {
@Enumerated(EnumType.ORDINAL) // default mapping, same without annotation
private Color color;
// other properties and methods
}
需要映射枚舉值的name的話,則
@Enumerated(EnumType.STRING)
以上兩種是常用的方式,但有時候情況會更復雜,比如數據庫中存儲的是枚舉值的小寫name,這時候就需要用到AttributeConverter,其實不光是枚舉類,其他需要自定義存儲的特殊類都可以統一編寫這個轉換器。
這裏我們就以枚舉類對AttributeConverter進行實現
public abstract class EnumConverter<E extends Enum<E>> implements AttributeConverter<E, String> {
@Override
public String convertToDatabaseColumn(E attribute) {
return attribute != null ? attribute.name().toLowerCase(Locale.ROOT) : null;
}
@Override
public E convertToEntityAttribute(String dbData) {
return dbData != null ? Enum.valueOf(attributeType(), dbData.toUpperCase(Locale.ROOT)) : null;
}
protected Class<E> attributeType() {
throw new UnsupportedOperationException("attributeType() must be overridden in concrete subclass");
}
}
具體的枚舉類只要實現attributeType()方法就好了
更自定義就方式就是直接去實現AttributeConverter,實現convertToDatabaseColumn()和convertToEntityAttribute()方法。