欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-20 20:05:42
...

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

    DB getData();
}


import javax.persistence.AttributeConverter;


/**
 * @param <ATTR> 实体类中枚举的类型,需实现{@link PersistEnum2DB} 接口
 * @param <DB>   保存到数据库的数据类型
 * @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;
相关标签: Enum存库 JPA