在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 ...
随机推荐
- HDFS的体系架构
通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS.MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍.基本涵盖了Hadoop分布式平台的全部技术核心. H ...
- devres in linux driver
写 driver 时, probe 中常常要为设备分配一些资源, 如 内存 / irq / gpio / iomap 等. 而在 probe 中失败时又要小心的释放掉这些资源. 底层驱动开发人员可能会 ...
- android 怎样将主菜单图标改成按安装时间排序
1. 在 LauncherModel.java 中增加例如以下代码, 假设是KK Launcher3 ApplicationInfo要替换为AppInfo public static final Co ...
- Openstack-Ceilometer-获取主机内存 的使用
1. 物理server配置 1.1安装 參考 http://blog.csdn.net/qq_21398167/article/details/47019751 1.2 配置 关闭selin ...
- 2016/3/10 PHP环境搭建 LAMP WAMP
1. php成为服务器端的脚本语言.弱类型语言.$ JavaScript是弱类型语言.var Java强类型语言.byte short int long double float boolean 2. ...
- 必备java参考资源列表
现在开始正式介绍这些参考资源. Web 站点和开发人员 Web 门户 网络无疑改变了共享资源和出版的本质(对我也是一样:您正在网络上阅读这篇文章),因此,从每位 Java 开发人员都应该关注的关键 W ...
- jeesite快速开发平台
兴致勃勃地下载下来准备好好研究一番,安装启动结果报错啦: java.lang.ClassNotFoundException: com.thinkgem.jeesite.modules.sys.list ...
- Servlet启动运行顺序
1.web项目执行属性 启动web项目后,web容器首先回去找web.xml文件,读取这个文件. 容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部 ...
- 循环冗余检验 (CRC) 算法原理
Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误. 算法原理 假设数据传输过程中需要发送15位的二进制信息g=10100 ...
- STM32F4 DMA2D_R2M
图像处理的专门DMA 看一段示例代码 /** * @brief Displays a line. * @param Xpos: specifies the X position. * @param Y ...