在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 ...
随机推荐
- 2012年公司组织旅游西安线个人记录(repost)
2012年公司组织旅游西安线个人记录 文件夹 [隐藏] 1 序言 2 第1天 3 第2天 4 第3天 5 第4天 6 第5天 [title=2012%E5%B9%B4%E5%85%AC%E5%8F% ...
- Datagrid接收JSON数据格式
开打View下面的Shared创建一个视图模版(母版页)<!DOCTYPE html> <html> <head> <title>Main</ti ...
- apache使用总结
由于某些原因,经常会使用apache(有时用nginx) 现在我主要用它做反向代理,偶尔弄一下负载均衡和添加head头 apache官网 http://httpd.apache.org/ 下载地址 h ...
- ORA-09817
连接数据库的时候报:ORA-09817:write to audit file,在网上搜索了下,发现时oracle安装目录下面的磁盘空间不够,有不少人给出了解决办法,下面即是一例: 连接oracle ...
- 迭代器-iteration
class CoffrrIterator implements Iterator<Coffee> { int cunt = size; public boolean hasNext() { ...
- Lightoj 1024 - Eid
求n个数的最小公倍数. import java.math.*; import java.io.*; import java.util.*; import java.text.*; public cla ...
- [10.26_P2] 最短路 (单源最短路应用)
单源最短路问题拓展 Description 给你一张图,图上有 n 个点,m 条边,要你找到两个点,使其最短路恰好包含给定的 k 个点.输出这条最短路的长度,输入保证有解. 输入格式 第一行两个数 n ...
- linux 下RTL8723/RTL8188调试记录(命令行)【转】
本文转载自:http://blog.h5min.cn/wuhongxin123/article/details/41820877 本文是在正确安装好wifi驱动后对系统进行的配置. 1. 配置wp ...
- 配置RabbitMQ远程访问
本文参考自:http://flashing.iteye.com/blog/1797531 1.如果远程客户端网络状况不是太好,比如adsl什么的,那么一定在客户端打开requstedHeartbeat ...
- 【Codevs1346】HelloWorld编译器
http://codevs.cn/problem/1346/ 可怜我战绩 // <1346.cpp> - 10/30/16 17:12:09 // This file is made by ...