枚举保存到数据库中为序号解决方案

普通枚举转换配置

枚举类

package com.gecko.charging.partner.enums;

import com.alibaba.fastjson.annotation.JSONType;
import com.gecko.charging.common.BaseEnum;
import com.gecko.charging.util.json.EnumDeserializer;
import com.gecko.charging.util.json.EnumSerializer;

/**
 * 合作商类型
 */
//@JSONType(serializer = EnumSerializer.class, deserializer = EnumDeserializer.class, serializeEnumAsJavaBean = true)
public enum PartnerType implements BaseEnum {
    agent(1),//代理商
    purchaser(2),//采购商
    operators(3),//运营商
    ;

    private Integer code;

    PartnerType(Integer code) {
        this.code = code;
    }

    @Override
    public Integer getCode() {
        return this.code;
    }
}

枚举转换类 @Converter(autoApply = true)自动适应

package com.gecko.charging.partner.enums.converter;

import com.gecko.charging.device.enums.DeviceExceptionStatus;
import com.gecko.charging.partner.enums.PartnerType;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.Objects;

/**
* @description: 合作商Converter
* @author: Wzq
* @create: 2020-03-02 14:33
*/
@Converter(autoApply = true)
public class PartnerTypeConverter implements AttributeConverter<PartnerType, Integer> {

   @Override
   public Integer convertToDatabaseColumn(PartnerType attribute) {
       return attribute.getCode();
   }

   @Override
   public PartnerType convertToEntityAttribute(Integer dbData) {
       for (PartnerType e : PartnerType.values()) {
           if (Objects.equals(e.getCode(), dbData)) return e;
       }
       return null;
   }

}

在实体类中使用

package com.gecko.charging.partner.entity;

import com.gecko.charging.partner.enums.PartnerType;
import com.gecko.charging.partner.enums.PartnerSettlementMethod;
import com.meenoframework.common.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Table;
import java.util.Date;

/**
 * @description: 合作商
 * @author: Wzq
 * @create: 2020-03-02 14:25
 */
@Entity
@Table(name = "partner")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class Partner extends BaseEntity {

    // 用户id
    private Long userId;

    // 邮箱
    private String email;

    // 公司名称
    private String companyName;

    // 组织机构代码
    private String orgCode;

    //区域id
    private String areaId;

    //详细地址
    @Column(columnDefinition = "TEXT")
    private String address;

    //合作商类型
    @Column(name = "type")
    private PartnerType partnerType;

    //结算方式
    private PartnerSettlementMethod settlementMethod;

    // 营业执照
    private String businessLicense;

    // 小区名称
    private String areaName;

    // 创建时间
    @CreatedDate
    private Date createTime;

    // 创建id
    @CreatedBy
    private Long creatorId;

    // 修改人
    @LastModifiedBy
    private Long updateId;

    // 修改时间
    @LastModifiedDate
    private Date updateTime;

    // 是否删除
    private Integer isDeleted;

}

高级适配玩法,上面那种方法需要一个枚举对应一个转换类很麻烦

基础枚举转换类

package com.gecko.charging.common.jpaenum.converter;

import com.gecko.charging.common.BaseEnum;

import javax.persistence.AttributeConverter;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;

public class BaseEnumConverter <X extends BaseEnum<Y>, Y> implements AttributeConverter<BaseEnum<Y>, Y> {

    private Class<X> xclazz;
    private Method valuesMethod;

    @SuppressWarnings("unchecked")
    public BaseEnumConverter() {
        this.xclazz = (Class<X>) (((ParameterizedType) this.getClass().getGenericSuperclass())
                .getActualTypeArguments())[0];
        try {
            valuesMethod = xclazz.getMethod("values");
        } catch (Exception e) {
            throw new RuntimeException("can't get values method from " + xclazz);
        }
    }

    @Override
    public Y convertToDatabaseColumn(BaseEnum attribute) {
        return attribute == null ? null : (Y) attribute.getCode();
    }

    @SuppressWarnings("unchecked")
    @Override
    public X convertToEntityAttribute(Y dbData) {
        try {
            X[] values = (X[]) valuesMethod.invoke(null);
            for (X x : values) {
                if (x.getCode().equals(dbData)) {
                    return x;
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("can't convertToEntityAttribute" + e.getMessage());
        }
        throw new RuntimeException("unknown dbData " + dbData);
    }
}


枚举基础类

package com.gecko.charging.common;

public interface BaseEnum<Y> {
    Y getCode();

    static BaseEnum[] getValues() {
        return new BaseEnum[0];
    }
}

枚举

package com.gecko.charging.device.enums;


import com.alibaba.fastjson.annotation.JSONType;
import com.gecko.charging.common.BaseEnum;
import com.gecko.charging.util.json.EnumDeserializer;
import com.gecko.charging.util.json.EnumSerializer;

/**
 * 设备归属枚举
 */
@JSONType(serializer = EnumSerializer.class, deserializer = EnumDeserializer.class, serializeEnumAsJavaBean = true)
public enum DeviceOwnerType implements BaseEnum<Integer> {
    PLATFORM(1),// 平台
    PROPERTY(2),// 物业商
    FRANCHISEE(3),// 加盟商
    ;

    private Integer code;

    DeviceOwnerType(Integer code) {
        this.code = code;
    }

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

        public static class Convert extends BaseEnumConverter<DeviceOwnerType, Integer> {

      }
}

实体类 需要加注解 @Convert(converter = DeviceOwnerType.Convert.class)

package com.gecko.charging.device.entity;


import com.gecko.charging.device.enums.*;
import com.meenoframework.common.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.util.Date;

/**
 * 充电设备
 * @Author: JeffGao
 * @Date: Created in 2020/2/24
 * @Description:
 */
@Entity
@Table(name = "charging_device")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class ChargingDevice extends BaseEntity {

  // 归属类型
  @Column(columnDefinition = "TINYINT")
  @Convert(converter = DeviceOwnerType.Convert.class)
  private DeviceOwnerType ownerType;
  // 归属者ID
  private Long ownerId;
  // 分润类型
  @Column(columnDefinition = "TINYINT")
  private ProfitShareType profitShareType;
  // 场景类型
  @Column(columnDefinition = "TINYINT")
  private SceneType sceneType;
  // 设备类型
  @Column(columnDefinition = "TINYINT")
  private DeviceType type;
  // 省市区编号
  private String areaId;
  // 纬度
  private String lat;
  // 经度
  private String lon;
  // sn号
  private String sn;
  // sn名称
  private String snName;
  // 插座数
  private Integer plugBaseCount;
  // 设备状态
  @Column(columnDefinition = "TINYINT")
  private DeviceStatus status;
  // 断电功率
  private Integer cutPower;
  // 收费套餐
  private Long feePackId;
  // 详细地址
  private String address;
  // 创建人
  private Long creatorId;
  @CreatedDate
  private Date createTime;
  @LastModifiedDate
  private Date updateTime;
  // 上线时间
  private Date onlineTime;

}

@Convert(converter = DeviceOwnerType.Convert.class)
使用这个注解配置生效!

个人微信公众,经常更新一些实用的干货:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容