java巧用@Convert實現(xiàn)表字段自動轉(zhuǎn)entity
1.背景
本人自入職以來,接了一堆歷史包(shi)袱(shan),其中有個服務(wù)是基于MongoDB實現(xiàn)的,而公司要搞信創(chuàng)化,去掉MongoDB是遲早的事,于是便開始分析底層數(shù)據(jù)結(jié)構(gòu),計劃用pg替換MongoDB。
2.難點
2.1 數(shù)據(jù)結(jié)構(gòu)不同
MongoDB是文檔型數(shù)據(jù)庫,而pg是關(guān)系型數(shù)據(jù)庫,原項目MongoDB的collection中某些字段類型為List或者entity,存在一對多的情況,如果采用新建關(guān)聯(lián)表的方式,會增加數(shù)據(jù)結(jié)構(gòu)復(fù)雜性,且底層數(shù)據(jù)幾乎不會變,因此,覺得直接用VARCHAR類型存儲List類型的json串。
2.2 數(shù)據(jù)類型轉(zhuǎn)換
服務(wù)的數(shù)據(jù)庫持久化使用的是jpa,原來MongoDB類型會自動轉(zhuǎn)成List,如下列的options屬性
@Data
@Document(collection = "input_item")
public class InputItem implements Comparable<InputItem> {
@Id
private String itemCode;
private String title;
private String description;
private int itemType;
private List<InputItemOption> options;
private String defaultOptionNum;
private String unit;
private boolean whetherActive;
}轉(zhuǎn)成pg后,options字段在數(shù)據(jù)庫中是String類型,需要轉(zhuǎn)成List。經(jīng)過調(diào)研,可以采用自定義Converter+注解@Convert來實現(xiàn)。
2.2.1 List類型
1)自定義Converter
import com.alibaba.fastjson.JSON;
import javax.persistence.AttributeConverter;
/**
* @ClassName JpaConverterListJson
* @Description jpa list轉(zhuǎn)換為String 相互轉(zhuǎn)換工具類
* @Author ygt
* @Date 2021/3/3 14:49
* @Version V1.0
*/
public class JpaConverterListJson implements AttributeConverter<Object, String> {
@Override
public String convertToDatabaseColumn(Object o) {
return JSON.toJSONString(o);
}
@Override
public Object convertToEntityAttribute(String s) {
return JSON.parseArray(s);
}
}2)@Convert注解
import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.Data;
import javax.persistence.*;
/**
*
* @Description 輸入項實體類
*
*/
@ApiModel("")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Table(name = "input_item")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class InputItem implements Comparable<InputItem> {
@GeneratedValue
@Column(name = "id")
@Id
private String itemCode;
@Column(name = "title")
private String title;
@Column(name = "description")
private String description;
@Column(name = "itemtype")
private int itemType;
@Convert(converter = JpaConverterListJson.class)
private List<InputItemOption> options;
@Column(name = "defaultoptionnum")
private String defaultOptionNum;
@Column(name = "unit")
private String unit;
@Column(name = "whetheractive")
private Boolean whetherActive;
@Override
public int compareTo(InputItem o) {
int index1 = Integer.parseInt(this.itemCode.substring(this.itemCode.lastIndexOf('_') + 1));
int index2 = Integer.parseInt(o.itemCode.substring(o.itemCode.lastIndexOf('_') + 1));
if (index1 < index2) {
return -1;
}
else {
return 1;
}
}
}2.2.2 entity類型
1)自定義Converter
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.test.src.domain.index.interest.InterestCreditScoreSection;
import javax.persistence.AttributeConverter;
import java.lang.reflect.ParameterizedType;
/**
* @ClassName JpaConverterListJson
* @Description jpa 泛型T轉(zhuǎn)換為String 相互轉(zhuǎn)換工具類
* @Author ygt
* @Date 2021/3/3 14:49
* @Version V1.0
*/
public class JpaConverterObjectJson<T> implements AttributeConverter<T, String> {
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public String convertToDatabaseColumn(T o) {
try {
return objectMapper.writeValueAsString(o);
} catch (Exception e) {
throw new RuntimeException("Failed to convert object to string", e);
}
}
@Override
public T convertToEntityAttribute(String s) {
try {
return objectMapper.readValue(s, (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
} catch (Exception e) {
throw new RuntimeException("Failed to convert string to object", e);
}
}
}import com.test.src.domain.index.interest.InterestCreditScoreSection;
public class InterestCreditScoreSectionConverter extends JpaConverterObjectJson<InterestCreditScoreSection>{
}2)@Convert注解
import com.fasterxml.jackson.annotation.JsonInclude;
import com.test.src.utils.InterestCreditScoreSectionConverter;
import io.swagger.annotations.ApiModel;
import lombok.NoArgsConstructor;
import lombok.*;
import javax.persistence.*;
/**
*
* @Description 利率授信實體類
*/
@ApiModel("")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Table(name = "interest_credit")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class InterestCredit {
@Id
@GeneratedValue
@Column(name = "id")
private String itemNo;
@Column(name = "recommendinterestformula")
private String recommendInterestFormula; //推薦執(zhí)行利率計算公式;
@Convert(converter = InterestCreditScoreSectionConverter.class)
@Column(name = "interestcreditscoresection")
private InterestCreditScoreSection interestCreditScoreSection;
}3.總結(jié)
針對不好處理的json string類型,可通過自定義converter+@Convert的方式實現(xiàn)自動轉(zhuǎn)換,另外,可在自定義converter類上加@Convert(autoApply = true)實現(xiàn)全局自動轉(zhuǎn)換。
到此這篇關(guān)于java巧用@Convert實現(xiàn)表字段自動轉(zhuǎn)entity的文章就介紹到這了,更多相關(guān)java 表字段自動轉(zhuǎn)entity內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中IdentityHashMap與HashMap區(qū)別詳解
- Java集合中的WeakHashMap、IdentityHashMap、EnumMap詳解
- Java8中關(guān)于Function.identity()的使用
- Java后端中dto、vo、entity的區(qū)別淺析
- Java中的javaBean、vo、entity、domain和pojo
- Java中Json與List、Map、entity的互相轉(zhuǎn)化
- Java詳解entity轉(zhuǎn)換到vo過程
- java 后臺開發(fā)中model與entity(實體類)的區(qū)別說明
- Java實體類(entity)作用說明
相關(guān)文章
ProtoStuff不支持BigDecimal序列化及反序列化詳解
這篇文章主要為大家介紹了ProtoStuff不支持BigDecimal序列化/反序列化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
eclipse輸出Hello World的實現(xiàn)方法
這篇文章主要介紹了eclipse輸出Hello World的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
spring 重復(fù)注解和aop攔截的實現(xiàn)示例
本文主要介紹了spring 重復(fù)注解和aop攔截的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
java利用Future實現(xiàn)多線程執(zhí)行與結(jié)果聚合實例代碼
這篇文章主要給大家介紹了關(guān)于java利用Future實現(xiàn)多線程執(zhí)行與結(jié)果聚合的相關(guān)資料,Future模式的核心,去除了主函數(shù)的等待時間,并使得原本需要等待的時間段可以用于處理其他業(yè)務(wù)邏輯,需要的朋友可以參考下2021-12-12
Java中jakarta.validation數(shù)據(jù)校驗幾個主要依賴包講解
在Java開發(fā)中,BeanValidationAPI提供了一套標準的數(shù)據(jù)驗證機制,尤其是通過JakartaBeanValidation(原HibernateValidator)實現(xiàn),文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-09-09
Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會無效問題
這篇文章主要介紹了Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會無效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

