需求背景

对于一些数据库字段,虽然它只有几种有限的内容种类,但它的格式并不完全遵守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()方法。


野小白
1 声望0 粉丝