@Enumerated的使用

news2024/11/27 21:07:37

前言

今天做测试,发现还没有试过实体类中关于枚举项的使用,于是就做了个测试,发现了点问题(发现的问题主要是针对我使用的ORM框架是Ebean,它自带了一个比@Enumerated更好用的注解和方式)。

不多说,直接进行说明 。。。


@Enumerated的使用测试

比如我有一张表,有一个字段是性别gender,这个字段我只想设置男女,于是我就想到了枚举,建表如下:

CREATE TABLE `j_test2` (	-- 忽略这里的表名,只是为了测试
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `gender` int(10) DEFAULT NULL, -- 注意这里性别使用了int类型,和@Enumerated会有关系
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

首先我们要明确的是将Enum类型的字段映射到数据库中有两种方式:

  1. 通过使用Enum类型实例在Enum中声明的顺序,也就是ordinal属性,通过这个序号来将Enum类型字段映射成int类型来存储。
  2. 通过使用Enum类型实例中的name属性来完成映射,这里讲Enum类型映射成String类型来完成存储。

定义的枚举如下:

package demo.springboot.cons;

/**
 * @author jiangkd
 * @date 2022/12/13 14:35:58
 */
public enum Gender {

    /**
     * 男
     * ordinal是0, name是MALE
     */
    MALE,
    /**
     * 女
     * ordinal是1, name是FEMALE
     */
    FEMAL

}

我们的实体类如下:

package demo.springboot.entity;

import demo.springboot.cons.Gender;
import lombok.*;
import lombok.experimental.Accessors;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

/**
 * @author j
 * @date 2022/12/13 14:34:45
 */
@Accessors(chain = true)
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Entity
// ORM使用的是Ebean,不是Mybatis,实体类会有所不同
@Table(name = "j_test2")
public class Jtest2 {

    private Integer id;

    private String name;
    /**
    * 性别使用了枚举
    */
    @Column(name = "gender")
    private Gender gender;
}

1.1.不使用注解@Enumerated

其实,不使用注解,默认的就是@Enumerated(EnumType.ORDINAL),也就是实体类gender属性改为如下:

	@Enumerated(EnumType.ORDINAL)
    @Column(name = "gender")
    private Gender gender;

测试插入两条数据:

package demo.springboot.enum_;

import demo.springboot.DemoSpringbootApplication;
import demo.springboot.cons.Gender;
import demo.springboot.entity.Jtest2;
import io.ebean.Database;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author j
 * @date 2022/12/13 14:42:51
 */
@SpringBootTest(classes = DemoSpringbootApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class Jtest2Test {

    @Autowired
    Database database;

    @Test
    public void add() {
        //
        final Jtest2 jtest = new Jtest2()
                .setName("test1")
                // 设置枚举MALE
                .setGender(Gender.MALE);
        // 保存到数据库
        database.save(jtest);

        final Jtest2 jtest2 = new Jtest2()
                .setName("test2")
                // 设置枚举FEMALE
                .setGender(Gender.FEMAL);
        // 保存到数据库
        database.save(jtest2);
    }
}

查看数据库:
在这里插入图片描述
可以看出,插入数据的时候,gender列对应的就是枚举项的ordinal序号,第一个MALE就是0,第二个FEMALE是1。这样就存在一个问题,如果我们又添加了一个OTHER的枚举项,放在了MALE后面,此时他们的ordinal序号就变了(MALE是0,OTHER是1,FEMALE就成了2了),这样的已经存入数据库的gender数据就和枚举项不对应了,容易出现问题。

所以我们推荐使用下面的方式,不存储枚举项的ordinal了,而是它的name。

1.2.使用@Enumerated(EnumType.STRING)

我们的枚举不动,依然是只有MALE和FEMALE,只是修改实体类中gender属性,添加注解@Enumerated(EnumType.STRING),如下:

    @Enumerated(EnumType.STRING)
    @Column(name = "gender")
    private Gender gender;

注意,一开始我们创建j_test2表的时候,gender属性我们使用的int类型,就是为了第一种方式存储枚举项的ordinal序号,而现在我们要存在的是枚举项的name(MALE,FEMALE),所所以数据库的gender类型要改为varchar类型,如下:

alter table j_test2 modify column gender varchar(10) null comment '性别';
truncate table j_test2; -- 清空数据, 便于测试查看

我们再次执行上面Jtest2Test的add方法 。。。

再次查看数据库:
在这里插入图片描述
咋样,此时gender存储的是枚举项的name了,这样就算枚举项添加,删除(ordinal变化)也没事了,因为我们存储的是name。

总结

虽然以上的使用没有什么问题,但有没有觉得怪怪的。

首先使用@Enumerated(EnumType.ORDINAL)的方式,就存在修改枚举项导致ordinal变化的问题。

其次使用@Enumerated(EnumType.STRING)的方式,也并没有达到我想要的效果,它只是存储了name,我想要的是数据库存储枚举项的构造参数值,查询或保存的时候使用的枚举项的name。(肯定有方式,但是我不想特殊处理一下之类的,就是直接使用即可那种)

我用的ORM框架式Ebean,发现Ebean中有个注解是@DbEnumValue,确实是我需要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

翻硬币(蓝桥杯C/C++B组真题详解)

目录 题目描述:1208. 翻硬币 - AcWing题库 题目思路: 代码详解: 题目描述:1208. 翻硬币 - AcWing题库 题目思路: 这题我们可以用模拟直接模拟操作 也可以直接推出规律 这里就讲解推出的规律 因为每次必须选择两个…

[附源码]计算机毕业设计二次元信息分享平台的设计及实现Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

[操作系统笔记]请求分页管理方式

内容系听课复习所做笔记,图例多来自课程截图 操作系统需要提供两大功能: 请求调页:缺失页面调入内存页面置换:暂时不用的换出外存 页表机制 原先的页式管理使用的页表并不能满足新的需求,因此需要为页表增加新的页表…

《垃圾回收算法手册 自动内存管理的艺术》——运行时接口(笔记)

文章目录十一、运行时接口11.1 对象分配接口11.1.1 分配过程的加速11.1.2 清零如何清零何时清零11.2 指针查找11.2.1 保守式指针查找11.2.2 使用带标签值进行精确指针查找11.2.3 对象中的精确指针查找11.2.4 全局根中的精确指针查找11.2.5 栈与寄存器中的精确指针查找11.2.6 代…

DI Blackfin DSP处理器-BF533的开发详解47:图像处理专题-Resize (图像缩放处理)(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像缩放处理,代码运行时,会通过文件系统打开工程文件根目下" …/ImageView"路径中的 tes…

JUnit 测试框架

JUnit注解test 注解BeforeEach 注解BeforeAll AfterEachAfterAll断言assertEqualsassertNotEqualsassertTrue用例执行顺序测试套件指定类,添加到套件中并执行一次添加一个包的类参数化单参数多参数借助文件动态参数注解 test 注解 通过对方法加上 test 注解&#…

[附源码]计算机毕业设计二手书店设计论文Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

DocArray 0.20.0 发布!新增 Milvus 后端支持,更好地嵌套数据搜索,新增 RGB-D 格式的 3D 模型表示

DocArray 是一个用于处理、传输和存储多模态数据的 Python 工具包。DocArray 提供便捷的多模态数据处理功能,具备基于 Protobuf 提供高性能的网络传输性能,同时也为多种向量存储方案提供统一的 API 接口。 GitHub:github.com/docarray/docar…

外包公司面试门槛高吗?软件测试员进外包公司容易吗?

虽然很多测试人员都抵制外包,但实际情况则是依旧有大量软件测试员,选择加入到外包这个圈子。外包公司面试门槛高吗?外包公司容易进吗?本篇来解答一下这个问题。 外包公司面试门槛高吗? 外包的面试门槛,相对大厂要低很多。尤其…

二、Docker 阿里云镜像加速

1、为什么需要增加镜像加速 咱们先看运行 hello word 都干了哪些事情 "Unable to find image hello-world:latest locally" 是说本地没有hello-world 这个images(镜像) "latest: Pulling from library/hello-world" 本地没有那就得去拉取 这段是拉取 i…

尚医通-MyBatisPlus:查询-删除(四)

(1)MyBatis-简单查询-分页查询 (2)MyBatisPlus删除与逻辑删除 (1)MyBatis-简单查询-分页查询 1.1通过多个id批量查询 完成了动态sql的foreach的功能 //多个id批量查询Testpublic void testSelect1() { …

C++ 入门篇之类 对象的关系

📒博客主页: ​​开心档博客主页​​ 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由开心档原创! 📆51CTO首发时间:🌴2022年12月12日🌴 ✉…

docker(3):镜像分层原理

目录UnionFS(联合文件系统)docker镜像加载原理分层理解commit镜像docker中,镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容、包括代码、运行时…

【计算机网络】HTTP首部详解

HTTP首部详解HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务端分别处理请求和响应提供所需要的信息。对于客户端用户来说,这些信息中的大部分内容都无需亲自查看。 1.HTTP请求报文 2.HTTP响应报文 3.首部字段类型 3.1 通用首部字段 首部…

在线CAD-梦想云图Node.JS服务

说明 后台提供梦想Node.JS服务,方便调用控件后台功能,Bin/MxDrawServer的安装目录中有Linux和Windows两个文件夹,用户可以根据自己的操作系统下载对应的程序。 启动服务 Windows:进入Bin\MxDrawServer\Windows目录,运行start.ba…

大数据毕业设计 新闻分类算法实现

文章目录1 简介1.1 本文章博主将介绍:2 参与及比较算法3 先说结论4 实现过程4.1 数据爬取4.2 数据预处理5 CNN文本分类6 最后1 简介 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦…

JUC并发编程详解

JUC并发编程详解一、Callable接口二、ReentrantLock类三、原子类四、线程池五、信号量Semaphore六、闭锁CountDownLatch七、线程安全的集合类7.1 多线程环境使用 ArrayList7.2 多线程环境使用队列7.3 多线程环境使用哈希表JUC > java.util.concurrent,这个包里放…

【AI with ML】第 1 章 :TensorFlow 简介

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

python使用bs模块爬取小说数据

目录 一、BS模块介绍 二、分析页面架构 三、代码实现 四、结果展示 五、总结思路 一、BS模块介绍 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据…

【云计算与大数据技术】Hadoop MapReduce的讲解(图文解释,超详细必看)

一、Hadoop MapReduce架构 MapReduce 是一种分布式计算框架,能够处理大量数据 ,并提供容错 、可靠等功能 , 运行部署在大规模计算集群中,MapReduce计算框架采用主从架构,由 Client、JobTracker、TaskTracker组成 Client的作用 用户编写 MapReduce程序…