1.问题产生的原因?
答:同一个实体类用在了两个业务当中,第一个业务是终端项目中的对工程开始和结束时间,数据从数据中心同步过来的时候,没有开始和结束时间为null,而业务中有开始和结束时间的值,可以通过前端展示和修改,由于每次更新会把开始时间和结束时间更新掉,就不符合业务了。
第二个业务是会定期从数据中心同步数据到项目中,由于更新用的是同一套实体类,所以对于已经存在项目中的数据更新,会把业务1中的数据更新为空。
2.如何解决的?
看了mybatis的官网,采用@TableField()字段的更新策略,
@TableField(value = "name",updateStrategy = FieldStrategy.IGNORED)
private String name;
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
private String sex;
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String addr;
三种更新策略,如上
ignored 不管有没有有设置属性,所有的字段都会设置到insert语句中,如果没设置值,全为null,这种在update 操作中会有风险,把有值的更新为null ;
not_null,也是默认策略,也就是忽略null的字段,不忽略"";
not-empty 为null,为空串的忽略,就是如果设置值为null,“”,不会插入数据库。
这样给实体类的属性加上注解 @TableField(updateStrategy = FieldStrategy.NOT_EMPTY),每次同步数据的时候打开注解,就不会更新到为null的数据了,项目中在关闭注解。
3.虽然上面可以解决问题,但是需要频繁的操作,数据同步和项目中的使用,对于不知道原有的同事容易遗忘,不是个最好的解决方案。
所以采用了实体类的细分,两个实体类分别对应不同的业务,互不影响,项目中的实体类就是正常的实体类,修改成什么就是什么,同步数据的业务中实体类是not-empty为null和“”的时候不更新数据。
这也是用到了不同的实体类,do是数据库对象,dto是数据传输对象。这样两个业务互不干扰。
关于do,dto,vo的详细解释参考网站:
https://blog.youkuaiyun.com/uestcyms/article/details/80244407
https://www.cnblogs.com/jiading/articles/13384722.html
https://www.zhihu.com/question/39651928
mybatis-plus策略详解:
https://blog.youkuaiyun.com/zhangxingyu126/article/details/104843634