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

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

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

    可以使用JPA 2.0保留枚举,但是没有很好的方法来实现. 使用@Enumerated批注,可以使用EnumType.ORDINAL或EnumType.STRING将枚举值映射到其数据库表示形式. 但 ...

  2. 一起谈.NET技术,ASP.NET2.0服务器控件之类型转换器

    类型转换器是实现自定义服务器控件属性过程中比较重要的内容.本文将对类型转换器的基本概念和实现方法进行介绍. 1. 类型转换器基本概念 类型转换器是自定义服务器控件的辅助性功能实现.它主要用于执行从字符 ...

  3. XAML实例教程系列 - 类型转换器(Type Converter)

    在XAML中每一个对象元素映射一个实例,而实例属性可以通过特性(Attributes)进行赋值.在实际项目开发中,对象元素的属性值可以是不同数据类型,根据需求不同,经常需要对数据类型进行转换,就需要使 ...

  4. 创建自定义类型转换器

    三种方法可以创建自定义类型转换器: 实现ognl.TypeConverter接口 继承DefaultTypeConverter类 继承StrutsTypeConverter类 一般使用继承Defaul ...

  5. 自定义的类型转换器中怎样自定义错误消息?(待解答)

    1.HTTP没有"类型"的概念,每一项表单输入只可能是一个字符串或一个字符串数组.从HTML表单到服务器端,必须把String转换为特定的数据类型. 2.字符串和基本数据类型之间的 ...

  6. 基于Struts 2的自定义类型转换器

    如果上面的类型转换器都是基于DefaultTypeConverter类实现的,基于该类实现类型转换器时,将字符串转换成复合类型要通过convertValue方法实现,将复合类型转换成字符串也是通过co ...

  7. springmvc中的类型转换器

    在使用springmvc时可能使用@RequestParam注解或者@RequestBody注解,他们的作用是把请求体中的参数取出来,给方法的参数绑定值. 假如方法的参数是自定义类型,就要用到类型转换 ...

  8. Struts2自定义类型转换器、自定义拦截器和用户输入数据的验证

    一.自定义类型转换器 1.编写一个类,继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter 2.覆盖掉其中的public Obj ...

  9. wpf中xaml的类型转换器与标记扩展

    wpf中xaml的类型转换器与标记扩展 原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是 ...

最新文章

  1. APPLE框架之高效便捷的Repository解决方案
  2. Android 手写Binder 教你理解android中的进程间通信
  3. Unity各个版本的离线文档下载和配置方法
  4. 错误处理:安装torch-sparse、torch-spline、torch-scatter、torch-cluster
  5. url-pattern写成/和/*的区别
  6. 单向链表操作之删除倒数第n个结点
  7. [导入]PHP通用分页类
  8. vlan绑定_图文并茂深入了解VLAN工作原理,不能错过干货
  9. Bitmap recycle()
  10. 装修月记第一弹,硬装篇
  11. centos7 mysql启动失败_Mysql主从复制
  12. 洛谷P2351 [SDOi2012]吊灯 【数学】
  13. php radio用法,JavaScript_JQuery radio(单选按钮)操作方法汇总,随着Jquery的作用越来越大,使 - phpStudy...
  14. SQlite数据库的C编程接口(七) 数据库锁定(Database Locking) ——《Using SQlite》读书笔记
  15. python爬虫大众点评_Python爬虫(三)爬取大众点评网
  16. python编程练习:爬虫爬取全国大江大河实时水情
  17. 信息安全-保研面试经历总结
  18. 微信小游戏开发零基础教程(一)-CocosCreator
  19. 2020大疆校招B卷第三题
  20. 一段经典模拟退火算法代码

热门文章

  1. 2018/7/6-纪中某C组题【jzoj1192,jzoj1397,jzoj1736】
  2. 你还在Java8中使用循环语句吗?
  3. JavaScript学习总结(八)——JavaScript数组
  4. Spring Boot Debug调试
  5. 从 Linux 源码看 Socket 的阻塞和非阻塞
  6. 数据结构(一)之链表
  7. java中你知道的这四种代码块吗?
  8. 利用bootstraptable展示数据,对数据进行排序分页等操作
  9. 优秀学生专栏——孙珩发
  10. FastDFS(分布式文件系统)