springboot+Jpa 框架中实现 枚举 序列化和反序列化

本文章只用实现下面这些就可以实现,全局枚举操作

 1.此类能实现web层,json数据的序列化和反序列化

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public enum SexEnum {
    /**
     *
     */
    MEN(0, "男"),
    WU_MEN(1, "女");

    private Integer code;

    private String msg;

    @JsonCreator
    public static SexEnum getEnum(Integer code) {
        for (SexEnum anEnum : values()) {
            if (anEnum.getCode().equals(code)) {
                return anEnum;
            }
        }
        throw new IllegalArgumentException("");
    }

    @JsonValue
    public Integer getCode() {
        return code;
    }

    SexEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }


    public void setMsg(String msg) {
        this.msg = msg;
    }


    public String getMsg() {
        return msg;
    }


    public void setCode(Integer code) {
        this.code = code;
    }


}

2.如果想实现数据库的枚举映射则需要自定义Convert类


public class EnumConvert  implements AttributeConverter<SexEnum,Integer> {

    @Override
    public Integer convertToDatabaseColumn(SexEnum sexEnum) {
        return sexEnum.getCode();
    }

    @Override
    public SexEnum convertToEntityAttribute(Integer integer) {
        return SexEnum.getEnum(integer);
    }
}

实体类需要添加 @Convert(converter = EnumConvert.class)
 

### 后期优化

因为每次添加一个枚举写一个转换类,太麻烦,代码量也大,就找了个方法,写了一个公共类 每个枚举只要实现 IBaseEnum类 ,在数据库实体 字段添加注解 @Type(type = "com..utils.DbEnumType"),就能实现全局注解使用;
1.IBaseEnum类
 

public interface IBaseEnum {

    /**
     * 描述
     *
     * @return
     */
    String getMsg();

    /**
     * 状态码--数据值
     */
    @JsonValue
    Integer getCode();

    @JsonCreator
    static <T extends IBaseEnum> T fromCode(Class<T> enumType, Integer code) {
        for (T object : enumType.getEnumConstants()) {
            if (code.equals(object.getCode())) {
                return object;
            }
        }
        throw new BaseException("错误信息");
    }
}

2.DbEnumType类
 

public class DbEnumType implements UserType, DynamicParameterizedType {
    private Class enumClass;
    private static final int[] SQL_TYPES = new int[]{Types.INTEGER};

    @Override
    public void setParameterValues(Properties parameters) {
        final ParameterType reader = (ParameterType) parameters.get(PARAMETER_TYPE);
        if (reader != null) {
            enumClass = reader.getReturnedClass().asSubclass(Enum.class);
        }
    }

    //枚举存储int值
    @Override
    public int[] sqlTypes() {
        return SQL_TYPES;
    }

    @Override
    public Class returnedClass() {
        return enumClass;
    }

    /**
     * 是否相等,不相等会触发JPA update操作
     *
     * @param x 参数
     * @param y 参数
     * @return
     * @throws HibernateException
     */
    @Override
    public boolean equals(Object x, Object y) throws HibernateException {
        if (x == null && y == null) {
            return true;
        }
        if (x == null || y == null) {
            return false;
        }
        return x.equals(y);
    }

    @Override
    public int hashCode(Object x) throws HibernateException {
        return x == null ? 0 : x.hashCode();
    }

    @Override
    public Object nullSafeGet(ResultSet resultSet, String[] names, SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException, SQLException {
        String value = resultSet.getString(names[0]);
        if (value == null) {
            return null;
        }
        for (Object object : enumClass.getEnumConstants()) {
            if (Objects.equals(Integer.parseInt(value), ((IBaseEnum) object).getCode())) {
                return object;
            }
        }
        throw new RuntimeException(String.format("Unknown name value [%s] for enum class [%s]", value, enumClass.getName()));
    }

    @Override
    public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor sharedSessionContractImplementor) throws HibernateException, SQLException {
        if (value == null) {
            st.setNull(index, SQL_TYPES[0]);
        } else if (value instanceof Integer) {
            st.setInt(index, (Integer) value);
        } else {
            st.setInt(index, ((IBaseEnum) value).getCode());
        }
    }


    @Override
    public Object deepCopy(Object value) throws HibernateException {
        return value;
    }

    @Override
    public boolean isMutable() {
        return false;
    }

    @Override
    public Serializable disassemble(Object value) throws HibernateException {
        return (Serializable) value;
    }

    @Override
    public Object assemble(Serializable cached, Object owner) throws HibernateException {
        return cached;
    }

    @Override
    public Object replace(Object original, Object target, Object owner) throws HibernateException {
        return original;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值