1.0jpa 2.0_JPA 2.1类型转换器–持久枚举的更好方法

1.0jpa 2.0

可以使用JPA 2.0保留枚举,但是没有很好的方法来实现。 使用@Enumerated批注,可以使用EnumType.ORDINALEnumType.STRING将枚举值映射到其数据库表示形式。 但是这两种选择都有一些缺点,我们将在本文的第一部分中进行讨论。 在第二部分中,我将向您展示通过使用JPA 2.1类型转换器来避免这些缺点。

使用JPA 2.0持久枚举

EnumType.ORDINAL使用Enum.ordinal()的返回值来保留枚举。 因此,枚举的第一个值将被映射为0,第二个将被映射为1,依此类推。 虽然这看起来很紧凑并且易于使用,但是在更改枚举时会引起问题。 删除枚举值或在两者之间的某个位置添加新值将更改以下所有值的映射,例如:

之前:

Vehicle:
CAR     -> 0
TRAIN   -> 1
PLANE   -> 2

后:

Vehicle:
CAR     -> 0
BUS     -> 1
TRAIN   -> 2
PLANE   -> 3

在第二个位置添加总线将需要更新数据库以修复枚举映射。

EnumType.STRING看起来是一个更好的选择。 它使用枚举的String表示形式将其持久保存在数据库中。 因此,添加或删除值不会更改映射。 但是这种表示可能非常冗长,重命名枚举值会破坏映射。

之前:

Vehicle:
CAR     -> CAR
TRAIN   -> TRAIN
PLANE   -> PLANE

后:

Vehicle:
CAR     -> CAR
BUS     -> BUS
TRAIN   -> TRAIN
PLANE   -> PLANE

使用JPA 2.1类型转换器

JPA 2.1类型转换器提供了第三种,我认为是最佳选择。 类型转换器使我们能够实现将实体属性的值转换为其数据库表示形式并返回的方法。 我不会在如何实现类型转换器方面介绍太多细节,因为在我以前的一篇文章中已经做了。

通过实现我们自己的映射,我们可以选择紧凑的数据库表示形式,并确保以任何方式更改枚举都不会破坏现有的映射。 下面的示例演示如何为Vehicle枚举实现类型转换器:

@Converter(autoApply = true)
public class VehicleConverter implements AttributeConverter<Vehicle, String> {@Overridepublic String convertToDatabaseColumn(Vehicle vehicle) {switch (vehicle) {case BUS:return "B";case CAR:return "C";case PLANE:return "P";case TRAIN:return "T";default:throw new IllegalArgumentException("Unknown value: " + vehicle);}}@Overridepublic Vehicle convertToEntityAttribute(String dbData) {switch (dbData) {case "B":return Vehicle.BUS;case "C":return Vehicle.CAR;case "P":return Vehicle.PLANE;case "T":return Vehicle.TRAIN;default:throw new IllegalArgumentException("Unknown value: " + dbData);}}}

VehicleConverter将枚举值映射到一个字符串。 通过使用@Converter(autoApply = true)进行声明,我们告诉JPA提供程序使用此Type Mapper来映射所有Vehicle枚举。 因此,我们不需要在Vehicle类型的每个实体属性中指定转换器。

但是,我们需要处理一件事,如果您阅读了我以前有关JPA Type Converter的文章,您可能已经想知道了。 类型转换器不能应用于用@Enumerated注释的属性。 因此,我们必须确保在Vehicle类型的实体属性中没有@Enumerated批注。

结论

我们实现了一个简单的类型转换器,该类型转换器使用我们自己的规则将Vehicle枚举转换为其数据库表示形式。 因此,我们可以确保更改Vehicle枚举的值不会破坏现有/剩余的映射。

  • 如果您想自己尝试,可以在github上找到源代码: https : //github.com/somethoughtsonjava/JPA2.1-EnumConverter

翻译自: https://www.javacodegeeks.com/2014/05/jpa-2-1-type-converter-the-better-way-to-persist-enums.html

1.0jpa 2.0

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

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

相关文章

从网络虚拟化,看智能网卡发展史

5G的到来无疑将加速网络虚拟化的进程&#xff0c;在电信领域&#xff0c;网络虚拟化不仅在核心网&#xff0c;也在网络的边缘。但是&#xff0c;仅仅通过软件解决方案不能提供足够的网络可靠性和服务质量&#xff0c;而具有高级可编程功能智能网卡&#xff08;Smart NIC&#x…

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版)

更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示&#xff0c;字体word有的基本都有&#xff0c;华文楷体、宋体&#xff0c;幼圆之类。西文字体默认字体Consloas就不错&#xff0c;中文的话幼圆、新宋体都挺不错。 幼圆效果&#xff1…

Java恶意序列化背后的历史和动机

与Java的序列化机制有关的问题已广为人知。 有效的Java 1st Edition &#xff08;第10章&#xff09;和有效的Java 2nd Edition &#xff08;第11章&#xff09;的整个最后一章都专门讨论Java的序列化主题。 Effective Java 3rd Edition &#xff08;第12章&#xff09;的最后一…

深入浅出全面解析RDMA

RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问&#xff0c;就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机&#xff0c;无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信&#xff0c;…

pat 乙级 1030 完美数列(C++)

题目 给定一个正整数数列&#xff0c;和正整数 p&#xff0c;设这个数列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;则称这个数列是完美数列。 现在给定参数 p 和一些正整数&#xff0c;请你从中选择尽可能多的数构成一个完美数列。 输入格式&…

hypervisor介绍

hypervisor&#xff1a;一种运行在物理服务器和操作系统之间的中间层软件&#xff0c;可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统&#xff0c;可以协调访问服务器上的所有物理设备和虚拟机&#xff0c;所以又称为虚拟…

pat 乙级 1031 查验身份证(C++)

题目 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xff0…

Selenium WebDriver中的TestNG侦听器及示例

Java提供了不同的接口&#xff0c;使您可以修改TestNG行为。 这些接口在Selenium WebDriver中进一步称为TestNG侦听器。 TestNG Listeners还允许您根据项目要求自定义测试日志或报告。 Selenium WebDriver中的TestNG侦听器是侦听某些事件并跟踪测试执行情况的模块&#xff0c;…

pat 乙级 1032 挖掘机技术哪家强(C++)

题目 为了用事实说明挖掘机技术到底哪家强&#xff0c;PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。 输入格式&#xff1a; 输入在第 1 行给出不超过 105 的正整数 N&#xff0c;即参赛人数。随后 N 行&#xff0c;每行给出一位参赛者的信息…

Ubantu键盘快捷键

Ubuntu系统 长按"Win"键可打开快捷键提示界面

win10安装python详细过程

关于python的安装 一切语言皆为工具接下来咱们就开始吧一切语言皆为工具 既然你决定安装它&#xff0c;那就已经告知自己要掌握这门工具&#xff0c; 但是有一定你一定要铭记于心那就是&#xff1a; python 是个工具时刻想着如何用它解决你的问题【哪怕是一个简单的想法】 接…

Spring Boot中的@SpringBootConfiguration注释

Spring Boot中的 SpringBootConfiguration注释是一个类级别的注释&#xff0c;它指示此类提供了应用程序配置。 通常&#xff0c;具有main&#xff08;&#xff09;方法的类最适合此注释。 我们通常使用SpringBootApplication批注&#xff0c;该批注会自动继承SpringBootConf…

第18次csp认证 201912-1 报数(C++)

题目 分析 需要跳过的包括&#xff1a;7的倍数和包括7的数。跳过的同时n要加一&#xff08;总的报n个数&#xff0c;跳过的不算&#xff09;。声明一个全局数组count[4]方法1&#xff1a;i1开始到n&#xff0c;把输入的i转化为字符串&#xff0c;然后在字符串里找’7’或者7的…

C++ vector求均值和方差

1 定义 &#xff08;1&#xff09;均值 &#xff08;2&#xff09;方差 &#xff08;3&#xff09;标准差 2 代码实现 //std::vector< double> 或者 std::vector< int> 类型变量求均值和方差 #include <numeric> #include <iostream> #include <m…

第18次csp认证 201912-2 回收站选址(C++)

题目 分析 每一个垃圾堆放处都可能是回收站&#xff0c;所以两轮循环&#xff0c;找出所有可以成为回收站的坐标。再两轮循环&#xff0c;确定所有回收站的得分最后输出每种得分的回收站个数 AC代码 #include <iostream> #include<string> using namespace std;…

Python——列表中存放字典遇到的问题

Python——列表中存放字典遇到的问题 使用列表、字典之间的相互嵌套可以很容易的实现json数据格式&#xff0c;但是昨天在往列表中装入字典时遇到了问题&#xff1a; 直接使用append方法将字典添加到列表中&#xff0c;如果需要更改字典中的数据&#xff0c;那么列表中的内容也…

jpa 返回数据转换_如何使用JPA类型转换器加密数据

jpa 返回数据转换几天前&#xff0c;我读了Bear Giles关于2012年使用JPA监听器进行数据库加密的有趣文章。他讨论了对加密解决方案的要求&#xff0c;并提供了JPA监听器的代码示例。 他的主要要求是&#xff1a; 提供不影响应用程序的透明加密&#xff0c; 能够在部署时添加加…

pat 乙级 1036 跟奥巴马一起编程(C++)

题目 美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形…

使用Jmeter的Websocket:获取性能数字

问题&#xff1a; 我最近遇到了一个问题&#xff0c;该问题需要针对多个用户测试SockJs / Stomp Spring Websocket代理的性能。 由于WebSocket本质上是异步的&#xff0c;因此它比常规的http / https请求-响应测试更加棘手。 解&#xff1a; 好了&#xff0c;无需解释为什么Jm…

NS3官方参考资料manual和tutorial

https://www.nsnam.org/releases/ns-3-33/documentation/