JPA 2.1类型转换器–保留枚举的更好方法

可以使用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

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

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

相关文章

LOADRUNNER8.1中文版加10000客户端破解补订

http://www.17testing.com/download/LR_8.1.iso LOADRUNNER8.1 用迅雷下载http://www.17testing.com/download/LR_8.1ChinesePack.iso 中文包http://blog.chinaunix.net/upfile/070509151030.rar 10000客户端的破解补丁 LR 8.1的介质可以从这里下载&#xff1a;http://www.17t…

css布局笔记(二)Flex

flex Flex是“Flexible Box”的缩写&#xff0c;意为“弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可指定为Flex布局。 .box{display:flex;} 行内元素也可以使用flex布局。 .box{display:inline-flex;} webkit内核的浏览器&#xff0c;必须加上-w…

BZOJ3709 Bohater 贪心

传送门 思路很妙…… 有个前提条件&#xff1a;血量无限&#xff0c;这样话肯定先打会回血的怪&#xff0c;再打会掉血的怪 对于会回血的怪&#xff0c;按照受到伤害的顺序从小往大打 对于会掉血的怪似乎并不是很好搞&#xff0c;考虑&#xff1a;将每一时刻的血量函数画出来&a…

反射与二次加工标准类型

反射与二次加工标准类型一、反射 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 有四个可以实现自省(反射)的函数&#xff0c;如下表所示&#xff1a; 函数名含义hasattr(object,name)判断object中有没有一个name字符串对应的方法或属性getattr(object,na…

Java 8 StampedLocks与ReadWriteLocks和同步

同步部分就像访问您的岳父母。 您希望尽可能少出现。 关于锁定&#xff0c;规则是相同的–您想花费最短的时间在关键区域内获取锁定&#xff0c;以防止形成瓶颈。 锁定的核心语言惯用法一直是用于方法和离散块的synced关键字。 这个关键字实际上已硬连接到HotSpot JVM中。 我们…

MSN on 2/16/2009

转载于:https://www.cnblogs.com/zxlin25/archive/2009/02/16/1391207.html

开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

在上篇随笔《基于微信小程序的系统开发准备工作》介绍了开发微信小程序的一些前期的架构设计、技术路线 、工具准备等方面内容&#xff0c;本篇随笔继续这个步骤&#xff0c;逐步介绍我们实际开发过程中对SSL协议的申请及后期处理过程&#xff0c;包括证书的IIS端口绑定&#x…

POJ 3253 Fence Repair

POJ 3253 Fence Repair 题目链接&#xff1a;http://poj.org/problem?id3253 题目大意 农夫约翰想修理牧场周围的一小段篱笆。他测量了栅栏&#xff0c;发现他需要N(1≤N≤20,000)块木板&#xff0c;每块长度为整数Li(1≤Li≤50,000)。然后&#xff0c;他买了一块长木板&#…

【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中&#xff0c;控制成员&#xff08;变量、方法、类等&#xff09;可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C、Java、PHP所使用的访问限制关键字和约定&#xff1a; 一、JavaScript ### JavaScript访问限制 早期的JavaScript并没有类似…

C#各类访问权限,封装,修饰符

C#各类访问权限&#xff0c;封装&#xff0c;修饰符。 (1) Pubilc &#xff1a;任何公有成员可以被外部的类访问。(2) Private &#xff1a;只有同一个类中的函数可以访问它的私有成员。(3) Protected &#xff1a;该类内部和继承类中可以访问。(4) internal : 同一个程序集的对…

在Java 8中使用Stream API列出ZIP文件的内容

在Java 8 java.util.zip.ZipFile配备了stream方法&#xff0c;该方法可以非常轻松地浏览ZIP文件条目。 在此博客文章中&#xff0c;我将展示许多示例&#xff0c;这些示例显示了我们可以如何快速浏览ZIP文件条目。 注意&#xff1a;就本博客而言&#xff0c;我将一个GitHub存储…

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法...

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 【标 题】&#xff1a;tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法【关键字】&#xff1a;tomcat5,jsp,getOutpu…

Web API应用架构设计分析(1)

Web API 是一种应用接口框架&#xff0c;它能够构建HTTP服务以支撑更广泛的客户端&#xff08;包括浏览器&#xff0c;手机和平板电脑等移动设备&#xff09;的框架&#xff0c; ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。本文主要以AS…

记手机端 下拉加载新数据

$(#container).unbind("scroll").bind(scroll,function(e){var sum this.scrollHeight - 5;console.log(sum)console.log($(this).scrollTop() $(this).height())if(sum <$(this).scrollTop() $(this).height()){ getmore();       }     }) $(#co…

一个切图仔的 CSS 笔记

1&#xff0c;flexbox~注意&#xff0c;设为 Flex 布局以后&#xff0c;子元素的float、clear和vertical-align属性将失效。 在ios8上要加上前缀 display: -webkit-box; display: -webkit-flex; display: -webkit-box; /* Chrome 4, Safari 3.1, iOS Safari 3.2 */ display: …

如何使用JPA Type Converter加密数据

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

go语言的排序和去重

go语言的排序&#xff1a; https://blog.csdn.net/u010983881/article/details/52460998 go语言去重&#xff1a; https://blog.csdn.net/qq_27068845/article/details/77407358 通过构造set去重&#xff08;go中没有set&#xff09;&#xff1a; https://studygolang.com/arti…

MapXtreme2008中操作矢量符号和定制符号

本文部分说明内容摘自网络文章&#xff0c;经过本人在MapXtreme2008中编写相关的演示例子&#xff0c;详细说明如何操作MapXtreme2008提供的矢量符号和定制符号。 MapXtreme 在其安装过程中自动安装 10 种 MapInfo 特定的 TrueType 字体。这些字体为用户提供了字形符号选择&am…

指甲之指甲长期没有甲半月弧(二)

中医的精是构成人体的基本物质。精来源于先天的禀赋及后天饮食营养。中医认为&#xff0c;气不耗归于肝为血&#xff0c;血不耗归于肾为精&#xff0c;精不耗归于骨为髓。 半月痕正是人体精髓的窗口。而半月痕的变化&#xff0c;犹如汽车上的油表一样&#xff0c;它会告颂人体&…

编写干净的测试–从配置开始

很难为干净的代码找到一个好的定义&#xff0c;因为我们每个人都有自己的单词clean的定义。 但是&#xff0c;有一个似乎是通用的定义&#xff1a; 干净的代码易于阅读。 这可能会让您感到有些惊讶&#xff0c;但是我认为该定义也适用于测试代码。 使测试尽可能具有可读性是我…