springDataJpa入門教程(9)-spring jpa實體屬性類型轉換器AttributeConverter的用法

springDataJpa入門教程

springDataJpa入門教程(9)-spring jpa實體屬性類型轉換器AttributeConverter的用法

有些情況下,實體類的屬性和數據庫的字段類型並不是一一對應的關係,比如說實體類的某個屬性爲枚舉類型,而數據庫字段是整型,這種情況下,需要藉助JPA提供AttributeConverter接口來完全實體類屬性和數據庫字段之間的映射。下面以User實體類爲例,講講AttributeConverter屬性轉換器的用法。
首先,來看一下User類的代碼:

import com.thizgroup.jpa.study.converter.SexEnumAttributeConverter;
import com.thizgroup.jpa.study.enums.SexEnum;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "tb_user")
@Data//使用lombok生成getter、setter
@NoArgsConstructor//生成無參構造方法
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  protected Long id;

  @Column(name = "name",columnDefinition = "varchar(64)")
  private String name;

  @Column(name = "mobile",columnDefinition = "varchar(64)")
  private String mobile;

  @Column(name="sex",columnDefinition = "int(1)")
  private SexEnum sex;
}

User類中,有個性別屬性sex,它的類型是枚舉類型,SexEnum.java如下:

import lombok.Getter;

@Getter
public enum SexEnum {

  MAN(1,"男"),
  WOMAN(2,"女");

  private Integer code;

  private String msg;

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

sex屬性對應的數據庫表字段類型爲int(1),數據庫中它是這樣的,
在這裏插入圖片描述
爲了解決屬性轉換的問題,我們來定義一個屬性轉換器類,並實現AttributeConverter接口。
AttributeConverter<X,Y>該接口中需要實現兩個方法:

  • y convertToDatabaseColumn(x) 作用:將實體屬性x轉化爲y存儲到數據庫中,即插入和更新操作時執行;
  • x convertToEntityAttribute(y) 作用:將數據庫中的字段y轉化爲實體屬性x,即查詢操作時執行。
import com.thizgroup.jpa.study.enums.SexEnum;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)//autoApply爲true表示這個轉換器被自動應用到所有的entity
public class SexEnumAttributeConverter implements AttributeConverter<SexEnum,Integer> {

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

  @Override
  public SexEnum convertToEntityAttribute(Integer code) {
    if(code == null) return null;
    SexEnum[] values = SexEnum.values();
    for(SexEnum sexEnum : values) {
      if(code.equals(sexEnum.getCode())) return sexEnum;
    }
    throw new IllegalArgumentException("無效的SexEnum:"+code);
  }
}

AttributeConverter屬性轉換器要配合@Converter註解來使用,@Converter註解的作用是告訴JPA這是一個屬性轉換器,autoApply =true的作用是表示這是一個全局的屬性轉換器,也就是說這個轉換器對所有的實體類都起作用,
AttributeConverter有兩個泛型參數:

  • 第一個參數表示實體類中需要被轉換的屬性類型。
  • 第二個參數表示與數據庫表字段對應的java類型。
    因此,這裏的泛型分別是SexEnum和Integer。
    接下來就是重寫AttributeConverter接口的兩個方法來實現屬性之間的轉換。
    注意:SexEnumAttributeConverter 類必須位於@EntityScan註解的包路徑下,否則轉換器將不起作用。代碼如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
//配置springDataJpa掃描Repository的包路徑
@EntityScan(basePackages = {"com.thizgroup.jpa.study.model","com.thizgroup.jpa.study.dto"
,"com.thizgroup.jpa.study.converter"})
@EnableJpaRepositories("com.thizgroup.jpa.study.dao")
@EnableJpaAuditing//啓動jpa審計功能
public class JpaApplication {

  public static void main(String[] args) {
    SpringApplication.run(JpaApplication.class,args);
  }

}

上面講的這種方式是將AttributeConverter轉化器作用於全局,對所有的實體類都起作用,但是在實際開發中,我們可能需要對某個實體類的屬性的轉換做特殊處理,那這種情況下,該怎麼辦呢?@Convert註解可以幫我們解決這個問題,將@Convert註解直接定義在實體類的屬性上,也同樣能實現屬性之間的轉換,代碼如下:

import com.thizgroup.jpa.study.converter.SexEnumAttributeConverter;
import com.thizgroup.jpa.study.enums.SexEnum;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "tb_user")
@Data//使用lombok生成getter、setter
@NoArgsConstructor//生成無參構造方法
public class User{

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  protected Long id;

  @Column(name = "name",columnDefinition = "varchar(64)")
  private String name;

  @Column(name = "mobile",columnDefinition = "varchar(64)")
  private String mobile;

  @Convert(converter = SexEnumAttributeConverter.class)
  @Column(name="sex",columnDefinition = "int(1)")
  private SexEnum sex;
}

好了,AttributeConverter的用法介紹就到此結束了,有需要源碼的朋友,請到git上下載源碼,源碼地址:https://github.com/hgq0916/springdatajpa-study.git。java學習交流羣:184998348,歡迎大家一起交流學習。

上一篇:springDataJpa入門教程(8)-JPA EnableJpaAuditing 審計功能
下一篇:springDataJpa入門教程(10)-JPA使用過程中遇到的坑及解決方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章