作用:
为了避免高频的数据关联查询,一种方案是做数据冗余,将其他表的部分字段冗余到当前表。但是这个方案牵扯一个数据修改后如何同步的问题,本功能就是为了解决这个问题而生的。
讲解:
基于@DataSource注解,框架会自动注册监听EntityUpdateEvent事件,响应的所有MP的Mapper的updateById和updateBatchById两个方法会自动发布EntityUpdateEvent事件。因此,除了MP的updateById和updateBatchById两个更新方法外,其他数据更新方式(比如手动写sql的形式)不会触发数据自动更新,如果想触发需要用户自己抛出EntityUpdateEvent事件,完成数据自动更新。
示例:
假设用户评论的场景,评论上需要冗余用户名和头像,如果用户的名字和头像有改动,则需要同步新的改动,代码如下:
@Data@Table(comment = "用户信息")public class User {@ColumnComment("主键")private String id;@ColumnComment("用户名")private String username;@ColumnComment("头像")private String icon;// 省略其他属性......}
@Data@Table(comment = "评论")public class Comment {@ColumnComment("主键")private String id;@ColumnComment("评论内容")private String content;@ColumnComment("评论人id")private String userId;// source指定了数据来源的Entity,同样可以使用sourceName来指定全路径的方式,field指定了映射哪个字段// conditions中隐含了一个joinField字段,该字段默认是“id”,即@Condition(selfField = "userId", joinField = "id")等同于示例中的写法@DataSource(source = User.class, field = "username", conditions = @Condition(selfField = "userId"))@ColumnComment("评论人名称")private String userName;// 如上,同理@DataSource(source = User.class, field = "icon", condition = @Condition(selfField = "userId"))@ColumnComment("评论人头像")private String userIcon;}
