普通枚舉轉(zhuǎn)換配置
枚舉類
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),//采購(gòu)商
operators(3),//運(yùn)營(yíng)商
;
private Integer code;
PartnerType(Integer code) {
this.code = code;
}
@Override
public Integer getCode() {
return this.code;
}
}
枚舉轉(zhuǎn)換類 @Converter(autoApply = true)自動(dòng)適應(yīng)
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;
}
}
在實(shí)體類中使用
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;
// 組織機(jī)構(gòu)代碼
private String orgCode;
//區(qū)域id
private String areaId;
//詳細(xì)地址
@Column(columnDefinition = "TEXT")
private String address;
//合作商類型
@Column(name = "type")
private PartnerType partnerType;
//結(jié)算方式
private PartnerSettlementMethod settlementMethod;
// 營(yíng)業(yè)執(zhí)照
private String businessLicense;
// 小區(qū)名稱
private String areaName;
// 創(chuàng)建時(shí)間
@CreatedDate
private Date createTime;
// 創(chuàng)建id
@CreatedBy
private Long creatorId;
// 修改人
@LastModifiedBy
private Long updateId;
// 修改時(shí)間
@LastModifiedDate
private Date updateTime;
// 是否刪除
private Integer isDeleted;
}
高級(jí)適配玩法攒巍,上面那種方法需要一個(gè)枚舉對(duì)應(yīng)一個(gè)轉(zhuǎn)換類很麻煩
基礎(chǔ)枚舉轉(zhuǎn)換類
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);
}
}
枚舉基礎(chǔ)類
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;
/**
* 設(shè)備歸屬枚舉
*/
@JSONType(serializer = EnumSerializer.class, deserializer = EnumDeserializer.class, serializeEnumAsJavaBean = true)
public enum DeviceOwnerType implements BaseEnum<Integer> {
PLATFORM(1),// 平臺(tái)
PROPERTY(2),// 物業(yè)商
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> {
}
}
實(shí)體類 需要加注解 @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;
/**
* 充電設(shè)備
* @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;
// 分潤(rùn)類型
@Column(columnDefinition = "TINYINT")
private ProfitShareType profitShareType;
// 場(chǎng)景類型
@Column(columnDefinition = "TINYINT")
private SceneType sceneType;
// 設(shè)備類型
@Column(columnDefinition = "TINYINT")
private DeviceType type;
// 省市區(qū)編號(hào)
private String areaId;
// 緯度
private String lat;
// 經(jīng)度
private String lon;
// sn號(hào)
private String sn;
// sn名稱
private String snName;
// 插座數(shù)
private Integer plugBaseCount;
// 設(shè)備狀態(tài)
@Column(columnDefinition = "TINYINT")
private DeviceStatus status;
// 斷電功率
private Integer cutPower;
// 收費(fèi)套餐
private Long feePackId;
// 詳細(xì)地址
private String address;
// 創(chuàng)建人
private Long creatorId;
@CreatedDate
private Date createTime;
@LastModifiedDate
private Date updateTime;
// 上線時(shí)間
private Date onlineTime;
}
@Convert(converter = DeviceOwnerType.Convert.class)
使用這個(gè)注解配置生效!
個(gè)人微信公眾橡淑,經(jīng)常更新一些實(shí)用的干貨: