spring jpa之实体属性类型转换器AttributeConverter

1、介绍接口AttributeConverter<x, y>

此接口用于转化实体属性的,但id属性和关系属性不可用。它有两个方法:

1、y convertToDatabaseColumn(x)  作用:将实体属性x转化为y存储到数据库中,即插入和更新操作时执行;

2、x convertToEntityAttribute(y)  作用:将数据库中的字段y转化为实体属性x,即查询操作时执行

2、实现的demo

需求:某数据库表中的状态列,1表示“启用”,-1表示“禁用”,-2表示“已删除”。

步骤一:创建StatusEnum,仅列出部分关键代码

public enum StatusEnum {
    ENABLE(1, "启用"), DISABLE(-1, "禁用"), DELETED(-2, "已删除");

    StatusEnum(Integer value, String description) {
        this.value = value;
        this.description = description;
    }
}

步骤二:实现AttributeConverter<String, Integer>接口,将代表数字与描述进行转换,其中实体类中的status字段为String类型

public class StatusAttributeConverter implements AttributeConverter<String, Integer> {

    @Override
    public Integer convertToDatabaseColumn(String status) {
        try {
            return Integer.parseInt(status);    //如果是数字,则直接返回(这里可以遍历StatusEnum的value来进一步验证)
        } catch (NumberFormatException e) {
            for (StatusEnum type : StatusEnum.values()) {    //如果不是数字,则通过StatusEnum来找到描述对应的数字
                if (status.equals(type.getDescription())) {
                    return type.getValue();
                }
            }
        }
        throw new RuntimeException("Unknown StatusEnum: " + status);    //如果StatusEnum里不存在代表数字或描述,则抛出异常
    }

    @Override
    public String convertToEntityAttribute(Integer value) {
        for (StatusEnum type : StatusEnum.values()) {    //将数字转换为描述
            if (value.equals(type.getValue())) {
                return type.getDescription();
            }
        }
        throw new RuntimeException("Unknown database value: " + value);
    }
}

步骤三:看下实体类

@Entity
@Table(name = "t_demo")
public class DemoEntity {
    @Convert(converter = StatusAttributeConverter.class)
    private String status; //状态:1 启用,-1 禁用,-2 已删除
}

3、优点

客户端不必再硬编码后台的数字与描述的对应细节。

服务端提供获取StatusEnum的接口,获取到[{"value":1, "description":"启用"}, {"value":-1, "description":"禁用"}, {"value":-2, "description":"已删除"}],客户端直接组装成下拉列表即可。


copyright = {
    "作者": "墨衣夜行", 
    "本文链接": "http://my.oschina.net/letao/blog/524487"
}
时间: 2024-08-03 02:09:51

spring jpa之实体属性类型转换器AttributeConverter的相关文章

spring boot 配置全局日期类型转换器

首先自定义一个类型转换器 import org.springframework.core.convert.converter.Converter;import org.springframework.stereotype.Component; import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date; @Componentpublic class MyDataConvert im

Spring MVC__自定义日期类型转换器

WEB层采用Spring MVC框架,将查询到的数据传递给APP端或客户端,这没啥,但是坑的是实体类中有日期类型的属性,但是你必须提前格式化好之后返回给它们.说真的,以前真没这样做过,之前都是一口气查询到数据,然后在jsp页面上格式化,最后展示给用户.但是这次不同,这次我纯属操作数据,没有页面.直接从数据库拿数据给它们返数据.它们给我传数据我持久化数据,说到这里一个小问题就默默的来了. 首先把问题还原一下吧(这是一个数据导出功能),下图中用红框圈起来的都是直接从数据库中拿到的数据,但是不幸的是它

SpringMVC类型转换器、属性编辑器

对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器.类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到DisptacherServlet,卸下请求中的数据 DisptacherServlet将请求中的数据发送给Controller 获取Controller需要接收的参数类型,将参数类型和请求数据发送给DataBinder DataBinder将参数类型和请求数据再发给TypeConverter,由Ty

Spring配置文件中注入复杂类型属性

Spring在整合其他框架时在配置文件中可能会涉及到复杂类型属性的注入,以下举例说明: 1.数组类型 2.List集合类型 3.Set集合类型 4.Map集合类型 5.Properties属性类型 直接上代码: 实体类:CollectionBean.java package com.imooc.ioc.demo5; import java.util.*; /** * Spring复杂类型的集合注入 */ public class CollectionBean { private String[]

Java实体Date类型属性值无法保存到数据表对应字段的问题

项目框架: maven+springMVC+mybatis 实体属性: //推荐时间private java.util.Date recommendDate; 数据库字段: ALTER TABLE `resource`ADD COLUMN `RECOMMEND_DATE`  date NULL COMMENT '推荐时间'; 属性赋值: resource.setRecommendDate(DateUtils.getNowDate()); 相关方法: 获取现在时间 /** * 获取现在时间 * *

Spring如何装配各种集合类型的属性

在前面我们已经会注入基本类型对象和其他bean,现在我们就来学习如何注入各种集合类型. Spring如何装配各种集合类型的属性 首先新建一个普通的Java Project,名称为spring_collection,并迅速搭建好Spring的开发环境. 接着在src目录下新建一个cn.itcast.service包,并在该包下创建PersonService接口,其代码为: public interface PersonService { Set<String> getSets(); List&l

sruts2 自定义类型转换器

1.1.1    Struts2中自定义类型转换器:(了解) 类型转换的过程是双向的过程: JSP---->Action参数提交:String---Date. Action---->JSP数据回显:Date---String. 自定义类型转换器: * 1.实现TypeConverter * convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object target, j

Android ORM系列之GreenDao自定义类型转换器与代码混淆配置

有时候,我们的实体类中会有一些属性,但是数据库中没有对应的类型,这个时候我们就需要自定义转换器进行类型转换.很常见的处理就是Date类型一般如果精度要求不高的话我们会转换为Long类型进行存储,读取的的时候再讲其转换为Date类型.那么如果我们想要让它直接以时间字符串存储呢,这个也好办,GreenDao为我们提供了自定义类型转换的支持. 首先,我们需要实现PropertyConverter接口,实现里面的两个方法convertToEntityProperty和convertToDatabaseV

JPA总结——实体关系映射(一对多@OneToMany)

JPA总结——实体关系映射(一对多@OneToMany) 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html 一对多模型(单向)说明:一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息.客户和地址是一对多的关系,并且客户与地址是单向关联的关系. 映射策略# 外键关联:两个表的关系定义在一个表中:# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联.映射策略——外键关联 表结构如下: 1 TABLE custom