转载请注明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 ,这就肯定不对了

那么这里出现了两个问题

  1. 映射的类型错误
  2. 映射的字段不能指定

我们使用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中使用自定义转换器之使用枚举转换的更多相关文章

  1. Spring data JPA中使用Specifications动态构建查询

    有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...

  2. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...

  3. 【hql】spring data jpa中 @Query使用hql查询 问题

    spring data jpa中 @Query使用hql查询 问题 使用hql查询, 1.from后面跟的是实体类 不是数据表名 2.字段应该用实体类中的字段 而不是数据表中的属性 实体如下 hql使 ...

  4. Spring Data JPA中CrudRepository与JpaRepository的不同

    使用Spring Data JPA CrudRepository 和JpaRepository 的好处: 继承这些接口,可以使Spring找到自定义的数据库操作接口,并生成代理类,后续可以注入到Spr ...

  5. Spring data jpa中Query和@Query分别返回map结果集

    引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...

  6. 如何在Spring Data JPA中引入Querydsl

    一.环境说明 基础框架采用Spring Boot.Spring Data JPA.Hibernate.在动态查询中,有一种方式是采用Querydsl的方式. 二.具体配置 1.在pom.xml中,引入 ...

  7. 在Spring Data JPA 中使用Update Query更新实体类

    对于 Spring Data JPA 使用的时间不长,只有两年时间.但是踩过坑的却不少. 使用下列代码 @Modifying @Query("update User u set u.firs ...

  8. Spring Data JPA 中常用注解

    一.java对象与数据库字段转化 1.@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表 2.@Table:设置实体类在数据库所对应的表名 3.@Id:标识类里所在变量为主 ...

  9. Spring Data Jpa 查询返回自定义对象

    转载请注明出处:http://www.wangyongkui.com/java-jpa-query. 今天使用Jpa遇到一个问题,发现查询多个字段时返回对象不能自动转换成自定义对象.代码如下: //U ...

随机推荐

  1. python 多线程中同步的小样例

    #!/usr/bin/python # -*- coding: UTF-8 -*- # 在一个资源池中.获取资源 # Author: zhang # Date: 2015-7-27 import ti ...

  2. UVa 401 Palindromes(镜像回文字符串)

     题意  给一个字符串 判定其是否为回文串和镜像串  回文串非常好推断  镜像串对于每个字符用数组保存它的镜像字符即可了  没有的就是空格 注意若字符串长度为奇数  中间那个字母必须是对称的才是镜 ...

  3. 2 TypeScript--Hello World

    安装好TypeScript后,我们来完成第一个页面--Hello World 新建index.html文件: <!DOCTYPE html> <html> <head&g ...

  4. 连接虚拟机的SQLServer

    1.IP可以互相PING通 2.Telnet发现端口没有放开,防火墙新建入账规则开放端口 成功..

  5. VMnet1和VMnet8 未识别的网络的解决方法

    我的系统是win7 64位,它居然不能识别VMnet1和VMnet8,在网上找了些资料,发现所有资料都是一样的.不过事实证明是正确的. 解决办法: 1,在运行中输入regedit 2,进入注册表[HK ...

  6. java集合的关系

    在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...

  7. CentOS 7.2 源码安装Python3.6

    1.环境 安装CentOS 7.2最小系统(CentOS-7-x86_64-Minimal-1511.iso) 2.需求 Python-3.6.4.tar.xz(官网下载) GCC(yum安装) 一堆 ...

  8. HDU1083 Courses —— 二分图最大匹配

    题目链接:https://vjudge.net/problem/HDU-1083 Courses Time Limit: 20000/10000 MS (Java/Others)    Memory ...

  9. 【CJOJ】Contest4 - A+B Series

    Position:http://oj.changjun.com.cn/contest.php?cid=4 A经典题目 // <A.cpp> - Sun Oct 9 15:28:01 201 ...

  10. BZOJ_4566_[Haoi2016]找相同字符_后缀自动机

    BZOJ_4566_[Haoi2016]找相同字符_后缀自动机 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有 ...