首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何持久化枚举值而不是Ordinal

持久化枚举值而不是Ordinal是指在将枚举值存储到数据库或其他持久化存储介质时,不使用枚举的序号(Ordinal),而是使用枚举的实际值。

传统上,枚举类型在编程中被用作一组常量的集合,每个常量都有一个与之关联的整数值,称为序号或索引。在持久化枚举值时,有时会使用枚举的序号来存储和检索数据。然而,这种方法存在一些问题:

  1. 可读性差:使用序号来表示枚举值在数据库中存储的含义,对于开发人员和维护人员来说,可读性较差,不直观。
  2. 可维护性差:如果在枚举类型中添加、删除或重新排序枚举常量,序号可能会发生变化,这会导致已存储的数据与新的枚举定义不匹配。
  3. 兼容性差:如果序号被用作存储枚举值的唯一标识,当枚举定义发生变化时,可能会导致数据不一致或错误。

为了解决这些问题,可以使用枚举的实际值来持久化枚举值。具体实现方法如下:

  1. 定义枚举类型:首先,定义一个枚举类型,包含需要持久化的枚举常量。
  2. 持久化枚举值:在将枚举值存储到数据库或其他持久化存储介质时,使用枚举的实际值来存储,而不是序号。可以将枚举值作为字符串、整数或其他适合的数据类型进行存储。
  3. 检索枚举值:在从数据库或其他持久化存储介质中检索枚举值时,使用存储的枚举值来匹配枚举类型中的常量。

持久化枚举值而不是Ordinal的优势包括:

  1. 可读性好:使用实际值来存储枚举值,可以直观地表示枚举的含义,提高代码的可读性和可维护性。
  2. 可维护性好:当枚举定义发生变化时,使用实际值来存储枚举值不会影响已存储的数据,保持数据的一致性。
  3. 兼容性好:使用实际值来存储枚举值,可以确保数据的兼容性,即使枚举定义发生变化,已存储的数据也能正确地映射到新的枚举定义。

应用场景: 持久化枚举值而不是Ordinal适用于任何需要将枚举值存储到数据库或其他持久化存储介质的场景。特别是在需要保持数据的一致性和可读性的情况下,使用实际值来存储枚举值是一个较好的选择。

腾讯云相关产品和产品介绍链接地址: 在腾讯云中,可以使用云数据库MySQL、云数据库CynosDB等产品来存储枚举值。这些产品提供了灵活的数据存储和检索功能,可以满足持久化枚举值的需求。具体的产品介绍和链接地址如下:

  1. 云数据库MySQL:腾讯云提供的关系型数据库服务,支持高可用、高性能的MySQL数据库。可以使用云数据库MySQL来存储枚举值,并通过SQL语句进行数据的存储和检索。详细信息请参考:https://cloud.tencent.com/product/cdb
  2. 云数据库CynosDB:腾讯云提供的高性能、高可用的分布式数据库服务,兼容MySQL和PostgreSQL。可以使用云数据库CynosDB来存储枚举值,并通过SQL语句进行数据的存储和检索。详细信息请参考:https://cloud.tencent.com/product/cynosdb

通过使用腾讯云的数据库产品,可以方便地实现持久化枚举值而不是Ordinal的需求,并保证数据的一致性和可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 使用javax.persistence注解配置PO对象

    简介 在Java中,javax.persistence是Java Persistence API(JPA)的一部分,它提供了一种机制来管理Java应用程序中的对象持久。...@Transient注释 在JPA中,@Transient注释用于标识一个属性不需要持久到数据库中。这个属性的在数据库中不会有对应的列。...@Transient private String tempData; // 其他属性声明省略... } 在上面的例子中,tempData属性被标记为不需要持久到数据库中...定义的枚举如下: package demo.springboot.cons; public enum Gender { /** * 男 * ordinal是0, name...ordinal序号,现在我们要存在的是枚举项的name(MALE,FEMALE),所所以数据库的gender类型要改为varchar类型,如下: 关系映射 JPA还提供了用于描述实体类之间关系的注释,

    17810

    JPA不识别MySQL的枚举类型

    数据字典型字段,枚举比Integer好: 限定,只能赋值枚举的那几个实例,不能像Integer随便输,保存和查询的时候特别有用 含义明确,使用时不需要去查数据字典 显示跟存储直接映射,不需要手动转换...StatusEnum status; Enumerated提供两种 3 持久枚举 3.1 EnumType.ORDINAL枚举的顺序保存数字。...缺点: 顺序性 java枚举的顺序从0开始递增,没法自己指定,我有些枚举不是从0开始的,或者不是+1递增的,比如一些行业的标准代码。 旧数据可能不兼容 如-1代表删除,映射不了。...不健壮 项目那么多人开发,保不准一个猪队友往枚举中间加了一个,那完了,数据库里的记录就要对不上了。数据错误没有异常,发现和排查比较困难。...3.2 EnumType.STRING 保存枚举,即toString()的

    6000

    Enum源码解析

    我们使用枚举,很多场合会用到该枚举的字串符表达,上述的实现中只能得到一个数字,不能直观地表达该枚举常量的含义。当然也可用 String 常量,但是又会带来性能问题,因为比较要依赖字符串的比较操作。...大多数程序员应该使用toString方法不是访问此字段。...* (此方法返回的可能与使用常量特定类体的枚举常数Object.getClass()方法返回的不同) * * @return 该类对象对应于此枚举常量的枚举类型 *...* * 请注意,对于特定枚举类型T , * 可以使用该枚举上隐式声明的public static T valueOf(String)方法, * 不是使用此方法将名称映射到相应的枚举常量...当一个Java类第一次被真正使用到的时候静态资源被初始、Java类的加载和初始过程都是线程安全的。

    1.1K10

    你一定需要知道的高阶JAVA枚举特性!

    JAVA枚举,比你想象中功能还要强大! 我经常发现自己在Java中使用枚举来表示某个对象的一组。 在编译时确定类型可以具有什么的能力是一种强大的能力,它为代码提供了结构和意义。...事实证明,Java枚举具有相当高级的特性,可以使代码干净、不易出错,功能强大。 让我们一起来看看Java中的一些高级枚举特性,以及如何利用这些特性使代码更简单、更可读。 枚举是类!...    }   } } 我们可以这样做:Operation.apply(Operation.ADD, 2, 3); 因为我们现在从Operation中调用方法,所以我们可以将其更改为实例方法并使用this,不是用...在我们的例子中,两个参数都是int,返回也是int。不幸的是,Java参数类型不支持原语,所以我们必须使用Integer。...与lambda配合使用,可以创建干净、安全的特定于枚举的函数实现,并在编译时强制执行它们(不是使用switch)。 下面是这个示例的GitHub地址。

    42820

    枚举类型enum用法(enum类型)

    【3】枚举类的语法 (1) 枚举类默认继承 java.lang.Enum 类,不是 Object 类,因此枚举类不能显示继承其他父类。...(2)在定义成员变量时指定默认。 (3)在初始块中指定初始。 实际上,后面两种方式并不常用。所以,应该为枚举类显示定义带参数的构造器。...当创建 MALE、FEMALE 枚举时,并不是直接创建 Gender 枚举类的实例,而是相当于创建 Gender 的匿名子类的实例。...对于一个抽象的枚举类(只要它包含了抽象方法,它就是抽象枚举类)而言,系统默认使用 abstract 修饰,不是 final 。...但因为枚举类需要显示创建枚举不是作为父类,所以定义每个枚举时必须为抽象方法提供实现,否则将出现编译错误。

    3K20

    java | 深入理解Java枚举类型(一)

    下面先来看看什么是枚举如何定义枚举?...枚举类型Day中分别定义了从周一到周日的,这里要注意,一般是大写的字母,多个之间以逗号分隔。...这里主要说明一下ordinal()方法,该方法获取的是枚举变量在枚举类中声明的顺序,下标从0开始,如日期中的MONDAY在第一个位置,那么MONDAY的ordinal就是0,如果MONDAY的声明位置发生变化...compareTo(E o)方法则是比较枚举的大小,注意其内部实现是根据每个枚举ordinal大小进行比较的。name()方法与toString()几乎是等同的,都是输出变量的字符串形式。...: 返回类型 方法名称 方法说明 T[] getEnumConstants() 返回该枚举类型的所有元素,如果Class对象不是枚举类型,则返回null。

    70120

    Kotlin Vocabulary | 枚举和 R8 编译器

    R8 不是默认开启的,如果您希望使用它 (例如您想要这里讨论到的那些优化时),就需要启用它。...首先,我们来看一个枚举的示例: enum class BlendMode { OPAQUE, TRANSPARENT, FADE, ADD } 这个枚举中包含四个。...假设您的一个库中包含了一个枚举您改变了这个枚举中值的顺序,您就可能破坏了某个人的应用。虽然这些代码除了顺序,看起来完全相同,但就是这种顺序的不同导致了对其它代码的影响。...所以取而代之的是,编译器将序数值与另一个做映射,这样一来,无论您对这些枚举做什么修改,基于这个库的代码都能正常运行。 当然,这就意味着只要像这样使用枚举,就会额外生成其它内容。...虽然所有这些开销没什么大不了的,但是却也意味着,在您不知情的时候,会生成一个类,而且其中还包含了一些数组,这些都会让类加载和实例消耗更多的时间。

    1K50

    Java枚举类与常用方法

    如何创建 首先,从名字就可以看出,枚举是一个类,那么我们就可以直接在创建时选择枚举就可以。 或者我们也可以在普通类前面加上enum关键词。...使用枚举 values() 返回枚举类中所有的ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。 valueOf()方法返回指定字符串枚举常量。...该方法为静态方法,调用者为枚举类,不是枚举; 该方法形参只要一个String类型的即可,并且该String枚举对应的名称,即toString()方法返回的(比如枚举类为SPRING,对应的名称就是..."SPRING"),所以肯定是需要双引号的; 扩展方法 compareTo(E o)方法:则是比较枚举的大小,注意其内部实现是根据每个枚举ordinal大小进行比较的。...],那么他将会输出一串地址,不是,后面的[ ]里面加上下标就可以输出对应值了。

    46730

    深入分析Java的enum

    枚举类型符合通用模式 Class Enum>, E 表示枚举类型的名称。...枚举类型的每一个都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序...默认情况下,枚举类会给所有的枚举变量一个默认的次序,该次序从0开始,类似于数组的下标。.ordinal()方法就是获取这个次序(或者说下标) 枚举变量的compareTo()方法。...name变量就是枚举变量的字符串形式。 还有一些其他的方法我就暂时不介绍了,感兴趣的话可以自己去看看文档或者源码,都挺简单的。 要点: 使用的是enum关键字不是class。...,星期天对应的ordinal就是0,周一对应的就是1,满足你的要求。

    1.3K110

    三歪问我为啥用枚举枚举有哪些用法?

    但是我们上面要求打印出来的是如”春季“等,不是名称本身,且四季对应的int也是必要的。...那么枚举有什么要注意的东西呢? 枚举使用的是enum关键字,不是class; 枚举变量之间用逗号隔开,且枚举变量最好用大写,多个单词之间使用“_"隔开(INT_SUM)。...定义完变量之后,以分号结束,如果只是有枚举变量,不是自定义变量,分号可以省略。 只需要类名.变量名就可以召唤枚举变量了,跟使用静态变量一样。...,每个枚举都定义了两个属性,name和ordinal,name表示枚举变量的名称,ordinal则是根据变量定义的顺序授予的整型,从0开始。...在枚举变量初始的时候,会自动初始这两个字段,设置相应的,所以会在Season()的构造方法中添加两个参数。

    1.1K60

    Spring Boot 枚举类型的自动转换

    1、Spring Boot 枚举类型的自动转换需求:一般我们在数据库都会定义数值型的枚举常量,不管是序列还是反序列都是需要我们手动去转换成枚举类型的,既然这样我们能不能让它们自动转换呢?...接下来我们就来尝试一下:首先解决如何接收枚举类型。... */ T getValue();}1.1、请求头接收参数添加Convert@Componentpublic class EnumConvertFactory implements ConverterFactory...JSON 字符串类型,那么 Jackson 默认是根据下标进行转换的,和我们根据匹配获取相应枚举不符,所以进行以下更改:添加枚举反序列化处理器@Data@EqualsAndHashCode(callSuper...1.3、添加自定义枚举序列接下来我们就要解决如何将数据库中的数值常量枚举转换成jackson 序列默认是按照名称序列的,和我们想返回枚举中的某个不符,下面我们进行一下小的改动:添加序列化处理器public

    50430

    走进 JDK 之 Enum

    从代码可读性来说,参数是个 int ,并不是那么直观的就可以看出来应该输入什么。无奈之下,我只得掏出 《Java 编程思想》,来治治这两个熊孩子。...Child,输入范围已经被限定为我定义的枚举,输入其他将无法通过编译。...枚举是 Java 1.5 中新增的引用类型,指由一组固定的常量组成合法的类型,其实上面的例子并不那么适合枚举,例如一年四季,一周七天这样的,更加适合枚举。...因此,用枚举来实现单例模式的话,是反序列安全的,因为即使反序列也不会生成新的对象。...; // 实际上是比较 ordinal } // 根据指定的枚举类型和名称返回枚举实例,在反序列中会使用 public static > T valueOf(Class

    66330

    重新认识java(十) —- Enum(枚举类)

    有的人说,不推荐使用枚举。有的人说,枚举很好用。究竟怎么使用,如何使用,仁者见仁智者见智。...默认请款下,枚举类会给所有的枚举变量一个默认的次序,该次序从0开始,类似于数组的下标。.ordinal()方法就是获取这个次序(或者说下标) 枚举变量的compareTo()方法。...() – 变量2.ordinal()】) 这是compareTo的源码,会先判断是不是同一个枚举类的变量,然后再返回差值。...name变量就是枚举变量的字符串形式。 还有一些其他的方法我就暂时不介绍了,感兴趣的话可以自己去看看文档或者源码,都挺简单的。 要点: 使用的是enum关键字不是class。...ordinal就是0,周一对应的就是1,满足你的要求。

    65520

    java 枚举(enum) 全面解读

    从反编译的Color类中可以看出,在enum关键字的类中,第一行 (准确的说是第一个分号前) 定义的变量,都会生成一个 Color实例,且它是在静态域中进行初始的, 静态域在类加载阶段的cinit中进行初始...- other.ordinal; } ordinal: 表示枚举的顺序,从Color类中可以看出,它是从0开始按自然数顺序增长,且其是final类型,外部无法更改.对于 ordinal()方法...) { return ordinal; } name: 表示枚举类的名字,从Color类的构造函数可以看出,它的就是我们定义的实例的名称....类加载时创建,保证线程安全 从Color类中可以看出, Color对象是在静态域创建,由类加载时初始,JVM保证线程安全,这样就能确保Color对象不会因为并发同时请求错误的创建多个实例....枚举则不同,在序列的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列的时候则是通过Enum的valueOf()方法来根据名字查找枚举对象。

    86910

    Java中的 Switch 是如何支持 String 的?为什么不支持 long?

    下面详细介绍下各个类型是如何被转变成 int 类型的,使用的编译命令为 javac,反编译网站为:http://javare.cn 二、枚举类型是咋变成 int 类型的?...在没有实验之前,我想当然的认为它是不是根据枚举的 int 型字段来计算的(因为一般枚举都是一个int型,一个string型),但是转念一想,万一枚举没有 int 型字段呢,万一有多个 int 型字段呢,...,发现其中多了一个 $VALUES 数组,内部包含了所有的枚举。...图片 枚举元素在数组中的下标由 ordinal() 函数决定,该方法就是返回枚举元素在枚举类中的序号。...一款基于 Spring Boot 的现代社区(论坛/问答/社交网络/博客)更多项目源码 这或许是最美的Vue+Element开源后台管理UI推荐一款高颜的 Spring Boot 快速开发框架 一款基于

    73130

    深入分析 Java 的枚举 enum

    所以在 emum Gender 那个枚举中的成员 Male 相当于是 public static final Male = new Gender$1("Male", 0); //不是 new Gender...枚举类型的每一个都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序...默认情况下,枚举类会给所有的枚举变量一个默认的次序,该次序从0开始,类似于数组的下标。.ordinal()方法就是获取这个次序(或者说下标) 枚举变量的compareTo()方法。...name变量就是枚举变量的字符串形式。 还有一些其他的方法我就暂时不介绍了,感兴趣的话可以自己去看看文档或者源码,都挺简单的。 要点: 使用的是enum关键字不是class。...,星期天对应的ordinal就是0,周一对应的就是1,满足你的要求。

    2K30
    领券