JPA+Enum枚举实现步骤流程

 更新时间:2025年10月16日 14:27:57   作者:匍匐前进の程序猿  
本文介绍了如何在Java中创建学生实体类及Sex枚举类,并通过@JsonValue注解实现枚举序列化,使用JPA的@Converter及AttributeConverter完成枚举与数据库字段的转换,最后通过controller层进行新增与查询测试

1.创建实体类(学生实体,Sex枚举类)

@Data
@Table
@Entity
public class Student {
	@Id
	@GeneratedValue(generator = "uuid")
	@GenericGenerator(name = "uuid",strategy = "org.hibernate.id.UUIDGenerator")
	private String id;
	private String name; // 姓名
	private Sex sex; // 性别
}

使用@JsonValue来标记枚举想要返回的序列化值

注意:建议枚举的编码不要使用数字

public enum Sex { // 性别
    GIRL("FM","女"),BOY("M","男");

    private String code;
    private String sName;
    
    Sex(String code,String sName) {
        this.code = code;
        this.sName = sName;
    }
    
    public String getCode() {
        return code;
    }
   /**
     * 将数据库查询到编码自动转为文字返回给前端
     */
    @JsonValue
    public String getsName() {
        return sName;
    }
}

2.创建Converter(属性转换器)

  • @Converter注解的作用是告诉JPA这是一个属性转换器
  • autoApply =true的作用是表示这是一个全局的属性转换器,也就是说这个转换器对所有的实体类都起作用
  • AttributeConverter<需要被转换的enum,与数据库表字段对应的java类型>
@Converter(autoApply = true)
public class SexConverter implements AttributeConverter<Sex, String> {
    /**
     * 此方法告诉jpa,数据库里存的值,即插入和更新操作时执行;
     */
    @Override
    public String convertToDatabaseColumn(Sex sex) {
        if(sex == null){
            return null;
        }
        return sex.getCode(); // 此处存储的是编码
    }

    /**
     * 此方法告诉Java从数据库里取出的值对应的是哪个enum值,即查询操作时执行。
     */
    @Override
    public Sex convertToEntityAttribute(String code) {
         if(code == null){
            return null;
        }
        for (Sex sex : Sex.values()) {
            if(sex.getCode().equals(code)){
                return sex; // 获取到当前Sex信息
            }
        }
        throw new IllegalArgumentException(); // 或者给个默认的enum eg: return Category.UNKNOWN
    }
}

3.创建controller层

@RestController
@RequestMapping("/student")
public class StudentController {
	@Autowired private StudentRepo repo;
	
	@PostMapping(path = "/save")
	public Student save(@RequestBody Student student) {
		repo.save(student);
		return student;
	}
	
	@GetMapping(path = "/list")
	public List<Student> list() {
		return repo.findAll();
	}
}

当需要在后端使用时,用此方法–>Sex.GIRL/Sex.BOY

4.数据库表,测试

新增测试

查询测试

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 排查Java进程内存占比过高的方法

    排查Java进程内存占比过高的方法

    某天下午运维反应集成环境的一个Java服务内存飙高,内存耗的太高了,会疑似内存泄漏,所以本文记一次排查Java进程内存占比过高的解决方法,需要的朋友可以参考下
    2023-10-10
  • 在CentOS上配置Java环境变量的教程

    在CentOS上配置Java环境变量的教程

    这篇文章主要介绍了在CentOS上配置Java环境变量的教程,同时适用于Fedora等其他RedHat系的Linux系统,需要的朋友可以参考下
    2015-06-06
  • java开发RocketMQ消息中间件原理基础详解

    java开发RocketMQ消息中间件原理基础详解

    最近 RocketMQ 刚刚上生产环境,闲暇之时在这里做一些分享,主要目的是让初学者能快速上手RocketMQ,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • SpringBoot开发案例 分布式集群共享Session详解

    SpringBoot开发案例 分布式集群共享Session详解

    这篇文章主要介绍了SpringBoot开发案例 分布式集群共享Session详解,在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,可能还会对单个微服务进行水平扩展,保证服务高可用,需要的朋友可以参考下
    2019-07-07
  • Windows下apache ant安装、环境变量配置教程

    Windows下apache ant安装、环境变量配置教程

    这篇文章主要介绍了Windows下apache ant安装、环境变量配置教程,ANT的安装很简单,本文同时讲解了验证安装是否成功的方法和使用方法实例,需要的朋友可以参考下
    2015-06-06
  • 微服务架构设计RocketMQ进阶事务消息原理详解

    微服务架构设计RocketMQ进阶事务消息原理详解

    这篇文章主要介绍了为大家介绍了微服务架构中RocketMQ进阶层面事务消息的原理详解,有需要的朋友可以借鉴参考下希望能够有所帮助
    2021-10-10
  • 关于java方法区详解

    关于java方法区详解

    这篇文章主要介绍了关于java方法区的使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 详解JAVA抓取网页的图片,JAVA利用正则表达式抓取网站图片

    详解JAVA抓取网页的图片,JAVA利用正则表达式抓取网站图片

    这篇文章主要介绍了详解JAVA抓取网页的图片,JAVA利用正则表达式抓取网站图片,非常具有实用价值,需要的朋友可以参考下。
    2016-12-12
  • IDEA2020如何打开Run Dashboard的方法步骤

    IDEA2020如何打开Run Dashboard的方法步骤

    这篇文章主要介绍了IDEA2020如何打开Run Dashboard的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java中的HashMap内存泄漏问题详解

    Java中的HashMap内存泄漏问题详解

    这篇文章主要介绍了Java中的HashMap内存泄漏问题详解,WeakHashMap中的key是弱引用,如果再使用之后没有及时remove掉这个key,那么当GC时key就可能会被回收,导致key对应的value对象占用的内存无法回收进而导致内存泄漏,需要的朋友可以参考下
    2023-09-09

最新评论