spring boot 枚举使用的坑3
上一篇说到spring boot 使用jackson在枚举enum序列化和反序列化的问题,
再来说说在JPA中实体entity使用枚举的问题。
还是这个枚举:
@Getter
@AllArgsConstructor
public enum EnumExpenseType implements BaseEnum {
小欢喜(1),
大欢喜(2); private final int value;
}
当然,如果value值和枚举的索引ordinal能够对应上,就不用做任务配置了,这里的前提是没有对应上。
无论是在实体的保存和查询映射上还是有和jackson序列化同样的问题,毕竟jpa是不知道我们的枚举的构造函数是什么的,除非我们告诉它。
直接上代码:
@Slf4j
public class EnumConverter<E extends BaseEnum> implements AttributeConverter<E, Integer> { private final Class<E> clazz; public EnumConverter(Class<E> clazz) {
this.clazz = clazz;
} @Override
public Integer convertToDatabaseColumn(BaseEnum attribute) {
return attribute.getValue();
} @SuppressWarnings("unchecked")
@Override
public E convertToEntityAttribute(Integer dbData) {
if (dbData == null) {
return null;
}
E[] enumConstants = clazz.getEnumConstants();
for (E e : enumConstants) {
if (e.getValue() == Integer.valueOf(dbData)) {
return e;
}
}
log.error("枚举转化异常。枚举【" + clazz.getSimpleName() + "】,数据库库中的值为:【" + dbData + "】");
return null;
}
}
这里关键的两个方法,一个是把枚举的值保存到数据时,使用我们定义的value,而不是索引ordinal。
另一个是从数据库中查询字段映射枚举时,按照value映射,而不是索引ordinal。
这只是一个抽象的方法,具体每个枚举还是再写一个类继承这个类,就可以了。
如:
public class EnumExpenseTypeConverter extends EnumConverter<EnumExpenseType> {
public EnumExpenseTypeConverter ()
{ super(EnumExpenseType.class); } }
spring boot 枚举使用的坑3的更多相关文章
- spring boot 枚举使用的坑
java 枚举的功能挺多,但是坑更多,使用的时候要注意.如下面这个枚举. @Getter @AllArgsConstructor public enum EnumExpenseType impleme ...
- spring boot 枚举使用的坑2
上一篇说到在枚举当在controller的方法做参数时的坑,解决方法是配置了一个converter,后来想想,如果不闲每次都加一个注解麻烦的话,可以在参数前面加一个注解,添加一个解析器应该也可以解决这 ...
- 部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)
部署spring boot + Vue遇到的坑(权限.刷新404.跨域.内存) 项目背景是采用前后端分离,前端使用vue,后端使用springboot. 工具 工欲善其事必先利其器,我们先找一个操作L ...
- 初学spring boot踩过的坑
一.搭建spring boot环境 maven工程 pom文件内容 <project xmlns="http://maven.apache.org/POM/4.0.0" xm ...
- Spring Boot 学习填的坑一
1.关于springBoot自动扫描规则: SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! "Application"类是指 ...
- spring boot & mybatis集合的坑
因为是使用的mybatis逆向工程自动生成的实体类和dao层,然后在读取某一个表的content字段时出现问题. 问题描述:在mysql数据库里可以直接查询到这个字段的内容,但是使用java相关的方法 ...
- 从源码看Spring Security之采坑笔记(Spring Boot篇)
一:唠嗑 鼓捣了两天的Spring Security,踩了不少坑.如果你在学Spring Security,恰好又是使用的Spring Boot,那么给我点个赞吧!这篇博客将会让你了解Spring S ...
- spring boot升级到2.x的坑
升级到spring boot 2.x后,发现了好多坑,现记录下来. 1.pom文件依赖的变化 1.x中,依赖是这样的: <dependency> <groupId>org.sp ...
- spring cloud: 升级到spring boot 2.x/Finchley.RELEASE遇到的坑
spring boot2.x已经出来好一阵了,而且spring cloud 的最新Release版本Finchley.RELEASE,默认集成的就是spring boot 2.x,这几天将一个旧项目尝 ...
随机推荐
- JUnit——单元测试步骤
步骤: 1. New Package(一般命名为*.Test,测试类与开发类放在不同的包中)2. New JUnit Text Case(一般命名为*Test)3. 选择需要测试的方法 4. 可以下载 ...
- (76)深入浅出Mqtt协议
物联网(Internet of Things,IoT)时代机器之间(Machine-to-Machine,M2M)的大规模沟通需要发布/订阅(Publish/Subscribe)模式,轻量级.易扩展的 ...
- prometheus 监控项
此处记录prometheus监控项,exporter为 node_exporter vim rules.yml groups: - name: node rules: - alert: server_ ...
- C# Cache缓存的应用
缓存类Cache的使用 直接先上代码 public class CacheHelper { private static string fileName = @"D:\huage.txt&q ...
- Tomcat配置多域名 Alias
在Tomcat配置多域名,目的是和apache相对应,实现多域名访问. 使用 < Alias></ Alias>,务必注意,使用的是首字母大写. 我刚开配置使用小写,如果hos ...
- rtmp协议分析
最近需要做一个rtmp服务器,着手分析一下rtmp协议,开干. rtmp握手 这个推荐一篇文章讲解得比较透彻http://blog.sina.com.cn/s/blog_676e11660102v8b ...
- 阶段3 1.Mybatis_03.自定义Mybatis框架_2.自定义Mybatis的分析-创建代理对象的分析
如何创建代理对象,以及使用设计模式带来的优势 调用的组合关系 不关注的,执行JDBC那一套.第二个是解析XML,解析的技术有很多.
- 【漏洞复现】局域网 ARP 中间人攻击 获取他人账号密码
日期:2019-07-18 14:24:42 更新: 作者:Bay0net 介绍:如何在局域网内,窃取其他用户的账号密码? 0x01. 漏洞环境 攻击工具 arpspoof 基本用法: arpspoo ...
- sql语句exists 用法
参考:SQL语句exists用法,Sql语句中IN和exists的区别及应用 现在有三张表 学生表S: sno ,sname 课程表C:cno ,cname 学生选课表SC: sno ,cno 查询选 ...
- LoadRunner之检查点
一.什么是检查点 LoadRunner中检查点是用来判断脚本是否执行成功的.如果不加检查点,只要服务器返回的HTTP状态码是200,VuGen就认为脚本执行通过了.但是很多情况下服务器返回200并不代 ...