文章目录
前言
状态映射关系太多?使用枚举变量,映射关系交给spring自动维护!!!告别烦恼!!!
一、环境
1、SpringBoot
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
2、JPA
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
二、代码
步骤一:配置JPA枚举
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class EnumConverter implements AttributeConverter<GradeEnum, String> {
/**
* 此方法告诉jpa数据库里存的值
*/
@Override
public String convertToDatabaseColumn(GradeEnum gradeEnum) {
if (gradeEnum == null) {
return null;
}
return gradeEnum.getDes();
}
/**
* 此方法告诉Java从数据库里取出的值对应的是哪个enum值
*/
@Override
public GradeEnum convertToEntityAttribute(String des) {
if (des == null) {
return null;
}
for (GradeEnum gradeEnum : GradeEnum.values()) {
if (gradeEnum.getDes().equals(des)) {
return gradeEnum;
}
}
throw new IllegalArgumentException(); // 或者给个默认的enum eg: return Category.UNKNOWN
}
}
步骤二:配置枚举类
@Getter
public enum GradeEnum {
PRIMARY(1, "小学"),
SECONDARY(2, "中学"),
HIGH(3, "高中");
private final Integer code;
private final String des;
GradeEnum(Integer code, String des) {
this.code = code;
this.des = des;
}
/**
* 使用@JsonValue,Jackson从默认序列化enum的name()换成这个。
*/
@JsonValue
public String des() {
return des;
}
}
步骤三:实体中使用Enum
@Data
@Table
@Entity
public class Student implements Serializable {
private static final long serialVersionUID = 7011752983426204134L;
@Id
private Integer id;
private String name;
private String sex;
// 枚举
private GradeEnum grade;
}
三、测试及结果
1、测试
@Test
void studentJpa(){
Student student = new Student();
student.setGrade(GradeEnum.HIGH);
studentRepository.save(student);
List<Student> students = studentRepository.findAll();
System.out.println(students);
}