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

摘要  AttributeConverter:实体属性类型转换器。主要使用场景:1、持久化enum;2、加解密数据;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"
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值