Springboot JPA 枚举Enum类型存入到数据库

1、使用JPA 的@Enumerated 注解 ,可以直接将Enum映射到数据库中。但是value的值只有两种方式选择,一种是使用枚举的序号映射,一种是枚举的名称来映射。

public enum EnumType {
    /** Persist enumerated type property or field as an integer. */
    ORDINAL,

    /** Persist enumerated type property or field as a string. */
    STRING
}

如果想存入枚举中的自定义的值,则需要实现AttributeConverter接口

2、实现AttributeConverter接口方式,@Covert 注解使用

/**
 * @param  : 保存到数据库的数据类型
 * @author peter
 * date: 2019-05-15 16:57
 **/
public interface PersistEnum2DB<DB> {

    DB getData();
}


import javax.persistence.AttributeConverter;


/**
 * @param  实体类中枚举的类型,需实现{@link PersistEnum2DB} 接口
 * @param    保存到数据库的数据类型
 * @author peter
 * date: 2019-05-15 16:59
 */
public abstract class AbstractEnumConverter<ATTR extends Enum<ATTR> & PersistEnum2DB<DB>, DB> implements AttributeConverter<ATTR, DB> {

    private final Class<ATTR> clazz;

    public AbstractEnumConverter(Class<ATTR> clazz) {
        this.clazz = clazz;
    }

    @Override
    public DB convertToDatabaseColumn(ATTR attribute) {
        return attribute != null ? attribute.getData() : null;
    }

    @Override
    public ATTR convertToEntityAttribute(DB dbData) {
        if (dbData == null) return null;

        ATTR[] enums = clazz.getEnumConstants();

        for (ATTR e : enums) {
            if (e.getData().equals(dbData)) {
                return e;
            }
        }

        throw new UnsupportedOperationException("枚举转化异常。枚举【" + clazz.getSimpleName() + "】,数据库库中的值为:【" + dbData + "】");
    }

}

使用方式
import com.tourcoo.parking.enums.convert2db.AbstractEnumConverter;
import com.tourcoo.parking.enums.convert2db.PersistEnum2DB;

/**
 * @author peter
 * create: 2019-05-15 14:33
 **/
public enum PayStatus implements PersistEnum2DB<Integer> {

    NONPAY(0, "未支付"),
    PAID(1, "已支付");

    private int code;
    private String msg;

    PayStatus(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    @Override
    public Integer getData() {
        return code;
    }


    public static class Converter extends AbstractEnumConverter<PayStatus, Integer> {

        public Converter() {
            super(PayStatus.class);
        }
    }

}
	//支付状态
    @Convert(converter = PayStatus.Converter.class)
    private PayStatus payStatus;

你可能感兴趣的:(Java学习笔记)