原文链接: 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的用法介绍就到此结束了