在spring data jpa中使用自定义转换器之使用枚举转换
转载请注明http://www.cnblogs.com/majianming/p/8553217.html
在项目中,经常会出现这样的情况,一个实体的字段名是枚举类型的
我们在把它存放到数据库中是需要将其映射为字符串或者其他类型
public enum Color{ RED(1, "RED"),
ORANGE(2, "ORANGE"); private Integer rainbowIndex;//在彩虹中的序号
private String name; Type(Integer rainbowIndex, String name) {
this.rainbowIndex= rainbowIndex;
this.name= name;
} public Integer getRainbowIndex() {
return rainbowIndex;
} public String getName() {
return name;
}
21
public static Type getTypeFromName(String name){
for (Type type : Type.values()) {
if (type.getName().equals(name)){
return type;
}
}
return null;
}
}
@Entity
@Table(name = "tb_paper")
public class Paper {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long no; private Color color; public Long getNo() {
return no;
} public void setNo(Long no) {
this.no= no;
}
public Color getColor() {
return type;
} public void setColor(Color type) {
this.type = type;
} }
如果这样直接写,会怎样?
在保存到数据库时没有错误信息,它帮我们生成一张表,而且还把其中一个字段rainbowIndex映射到了数据表tb_paper上的color字段(从参数类型上可以看出),
CREATE TABLE `tb_paper` (
`no` bigint(20) NOT NULL AUTO_INCREMENT,
`color` int(11) DEFAULT NULL,
PRIMARY KEY (`no`)
) DEFAULT CHARSET=utf8;
那我两个参数在实体中都是String类型的,框架会帮我如何选择?
public enum Color{ RED("1", "RED"),
ORANGE("2", "ORANGE"); private String rainbowIndex;//在彩虹中的序号 我们这里改成String类型 虽然使用数值类型比较恰当
private String name; Type(String rainbowIndex, String name) {
this.rainbowIndex= rainbowIndex;
this.name= name;
} public String getRainbowIndex() {
return rainbowIndex;
} public String getName() {
return name;
}
21
public static Type getTypeFromName(String name){
for (Type type : Type.values()) {
if (type.getName().equals(name)){
return type;
}
}
return null;
}
}
发现数据库还是 `color` int(11) DEFAULT NULL ,这就肯定不对了
那么这里出现了两个问题
- 映射的类型错误
- 映射的字段不能指定
我们使用jpa2.1规范里面的属性转换器
@Converter(autoApply = true)
public class ColorConverter implements AttributeConverter<Color, String> {//泛型指的是你在实体用的类型,第二个是指需要映射到数据库的类型对应的java中的类型 @Override
public String convertToDatabaseColumn(Color attribute) {
return attribute.getName();
} @Override
public Color convertToEntityAttribute(String dbData) {
return Color.getColorFromName(dbData);
}
}
看下数据库表 `color` varchar(255) DEFAULT NULL ,字段映射对了,需要注意的是如果上面注解@Converter的没有(autoApply = true),(默认)表示在所有用到Color类型的实体映射是将默认映射为Integer类型,其实就是不生效,如果需要全局生效,加上(autoApply = true)就可以了,如果需要对于一个实体的一个属性单独处理的话,在需要的属性加上@Convert(converter = ColorConverter.class)
参考
http://hantsy.blogspot.com/2013/12/jpa-21-attribute-converter.html
https://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/
转载请注明http://www.cnblogs.com/majianming/p/8553217.html
在spring data jpa中使用自定义转换器之使用枚举转换的更多相关文章
- Spring data JPA中使用Specifications动态构建查询
有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...
- Spring Data JPA中的动态查询 时间日期
功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...
- 【hql】spring data jpa中 @Query使用hql查询 问题
spring data jpa中 @Query使用hql查询 问题 使用hql查询, 1.from后面跟的是实体类 不是数据表名 2.字段应该用实体类中的字段 而不是数据表中的属性 实体如下 hql使 ...
- Spring Data JPA中CrudRepository与JpaRepository的不同
使用Spring Data JPA CrudRepository 和JpaRepository 的好处: 继承这些接口,可以使Spring找到自定义的数据库操作接口,并生成代理类,后续可以注入到Spr ...
- Spring data jpa中Query和@Query分别返回map结果集
引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...
- 如何在Spring Data JPA中引入Querydsl
一.环境说明 基础框架采用Spring Boot.Spring Data JPA.Hibernate.在动态查询中,有一种方式是采用Querydsl的方式. 二.具体配置 1.在pom.xml中,引入 ...
- 在Spring Data JPA 中使用Update Query更新实体类
对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ...
- Spring Data JPA 中常用注解
一.java对象与数据库字段转化 1.@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表 2.@Table:设置实体类在数据库所对应的表名 3.@Id:标识类里所在变量为主 ...
- Spring Data Jpa 查询返回自定义对象
转载请注明出处:http://www.wangyongkui.com/java-jpa-query. 今天使用Jpa遇到一个问题,发现查询多个字段时返回对象不能自动转换成自定义对象.代码如下: //U ...
随机推荐
- vux tabbar 组件
1.App.vue <!-- 入口文件 --> <template> <div id="app"> <!-- 视图层 --> < ...
- Ubuntu16.04下安装Tensorflow CPU版本(图文详解)
不多说,直接上干货! 推荐 全网最详细的基于Ubuntu14.04/16.04 + Anaconda2 / Anaconda3 + Python2.7/3.4/3.5/3.6安装Tensorflow详 ...
- 网络知识: 物理层PHY 和 网络层MAC
PHY模块简介 物理层位于OSI最底层,物理层协议定义电气信号.线的状态.时钟要求.数据编码和数据传输用的连接器. 物理层的器件称为PHY. 上图里的灰色方框图里的就是PHY芯片内部模块图. MAC器 ...
- [Sciter] 1. 创建最简单的Sciter项目
一些函数 sciter::debug_output_console _; 程序运行时自动启动一个控制台窗口,通过在_tiscript_中调用stdout.println来输出调试信息 SciterSe ...
- IIS老革命遇到的一些问题
今天部署一个网站到IIS,遇到了一些问题.老革命遇上新问题.前不久搞java,接触了一下tomcat,觉得真麻烦.而tomcat大概是java阵营中最简单的了吧.想不到,IIS7,友好的图形界面下,也 ...
- 原创教程之——reactjs 组件入门教程
在学习react之前,希望你有以下准备: react的安装ECMAScript 6基础 本文不讲解react的安装步骤,若需了解请移步官方网站(https://reactjs.org/),那里讲解非常 ...
- jdk 版本不一致导致的错误
平时做项目时难免会从git,svn下载代码或者把别人的项目文件导入到自己的MyEclipse中进行操作,因此会遇到很多问题,常见的有一种是使用的jdk版本不一致造成的报错, 错误案例: 错误提 ...
- Java 并发 —— 读写锁(ReadWriteLock)
读写锁(ReadWriteLock),顾名思义,就是在读写某文件时,对该文件上锁. 1. ReentrantReadWriteLock 三部曲: 加锁: 读写操作: 解锁:(为保证解锁操作一定执行,通 ...
- AutoIT:为文件夹下面的文件批量改名
以前用Ruby脚本,对于中文,数字结合的文件名,修改名字也不是非常简单,需要修改字符集,可是用autoit来实现,也挺简单的,并且可以替换已有文件名中的汉字部分. $filepath = " ...
- CF 757 E Bash Plays with Functions —— 积性函数与质因数分解
题目:http://codeforces.com/contest/757/problem/E 首先,f0(n)=2m,其中 m 是 n 的质因数的种类数: 而且 因为这个函数和1卷积,所以是一个积性函 ...