概述
对象之间的转换在开发中是最常见的,实体对象和数据显示层(VO,DTO等)的转换,通常有 2 种做法:
set 方法赋值,这种方式一般使得代码冗余,而且极不美观;
对象拷贝工具类,如 Spring 的 BeanUtils.copyProperties 。
而我最近在使用 Spring 的拷贝工具类的时候碰到了属性值丢失的情况,先看这样一个栗子。
订单实体类到 VO 层的转换:
转换后的结果如下:
从上面可以看到 2 个问题:
对象 copy 后没有 id 并没有赋值;
VO 对象的改变影响了原订单的值。
问题一
先看第 1 个问题。
一般在项目开发中会把实体类中一些公共的字段(如 id,创建日期等)抽为一个公共的实体,如下:
BaseEntity
可以看到这里的BaseEntity中定义的 id 是一个泛型,因为在项目中有 2 中主键类型,一种是 String 类型的,一种是 Long 类型的,如下:
LongBaseEntity,主键为 Long 类型的,实体类主键若为Long,继承它即可。
UUIDBaseEntity,主键为 String 类型的,实体类主键若为 String ,继承它即可。
而订单类如下,一般来说这里不会存在其他对象,这里订单详情的目的仅仅是为了演示上面的第二个问题。
订单详情:
数据展示 VO:
然后当我把 TicketOrder 转为 TicketOrder