作用:
为了避免高频的数据关联查询,一种方案是做数据冗余,将其他表的部分字段冗余到当前表。但是这个方案牵扯一个数据修改后如何同步的问题,本功能就是为了解决这个问题而生的。
讲解:
基于@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;
}