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 <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;
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值