原文链接: blog.csdn.net/hgq0916/art…

有些情况下,实体类的属性和数据库的字段类型并不是一一对应的关系,比如说实体类的某个属性为枚举类型,而数据库字段是整型,这种情况下,需要借助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 {
  @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;
123456789101112131415161718192021222324252627282930

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;
12345678910111213141516

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); 1234567891011121314151617181920212223

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);

1234567891011121314151617181920

上面讲的这种方式是将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{
  @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;
12345678910111213141516171819202122232425262728293031

好了,AttributeConverter的用法介绍就到此结束了

分类:
阅读
标签: