博客 / 詳情

返回

枚舉類映射數據庫字段的幾種實現方式

需求背景

對於一些數據庫字段,雖然它只有幾種有限的內容種類,但它的格式並不完全遵守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()方法。

user avatar lankerens 頭像 eisuto 頭像 dm2box 頭像 docker_app 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.