转载请注明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. 积跬步,聚小流------ps有用小技巧,改变png图标颜色

    *  实现效果: 原图:  改动后: *  实现目的: 满足为实现不同界面色彩搭配改动png图标的颜色 *  实现方法: 1.打开Photoshop工具,导入须要进行改动的png图标: 2.对导入的图 ...

  2. Python练习题2

    如果真的想学精,学什么都不是好学的,如果真的想把Python学的出神入化,几乎自己想做什么都可以,就要下定恒心,坚持下去. 接下来继续更新Python练习题2,通过更新前一部的练习题让自己也学到了不少 ...

  3. hdu1576 mod 运算的逆元

    Problem Description 要求(A/B)%9973,但因为A非常大,我们仅仅给出n(n=A%9973)(我们给定的A必能被B整除.且gcd(B,9973) = 1).   Input 数 ...

  4. java 报错非法的前向引用

    今天在看<thinking in java>的时候,第四章提到了非法的前向引用,于是自己试了一下,书中的例子倒是一下就明白了,但是自己写的一个却怎么也不明白,于是上网问了一位前辈,终于明白 ...

  5. C语言变长数组data[0]总结

    C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...

  6. 大学生程序设计邀请赛(华东师范大学)B. 分词 DP

    B. 分词   有一句句子因为粘贴的时候出现了一点问题空格全部丢失了.现在给一本字典,每个词都对应这个词出现的频率(每十亿).根据这个频率,我们可以根据下面的公式算出这个词带来的收益 P(word): ...

  7. mysql07---主从复制

    mysql主从复制,replication,(可以一主多从,不可一从多主) 原理: 主从分离,最少2台服务器.主服务器里面的数据,要在从服务器里面都有一份. 把主服务器的所有insert,update ...

  8. HDU1269 迷宫城堡 —— 强连通分量

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    M ...

  9. What's the difference between HEAD, working tree and index, in Git?

    What's the difference between HEAD, working tree and index, in Git?

  10. eclipse自动创建项目出错Cannot change version of project facet Dynamic Web Module to 2.3.

    Cannot change version of project facet Dynamic Web Module to 2.3. step1:修改properties step2:修改web.xml ...