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

来源:互联网 发布:怀化学院锐捷网络 编辑:程序博客网 时间:2024/05/04 06:02
摘要 AttributeConverter:实体属性类型转换器。主要使用场景:1、持久化enum;2、加解密数据;3、持久化日期。

目录[-]

  • 1、介绍接口AttributeConverter<x, y>
  • 2、实现的demo
  • 3、优点
  • 1、介绍接口AttributeConverter<x, y>

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

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

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

    2、实现的demo

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

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

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    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类型

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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);
        }
    }

    步骤三:看下实体类

    ?
    1
    2
    3
    4
    5
    6
    @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":"已删除"}],客户端直接组装成下拉列表即可。




    ?
    1
    2
    3
    4
    copyright = {
        "作者""墨衣夜行"
        "本文链接""http://my.oschina.net/letao/blog/524487"
    }

    0 0
    原创粉丝点击