聚合根保存
2025/9/10大约 6 分钟
聚合根保存
eq
在3.1.24
后实现了聚合根保存模式,能够在track
模式下实现对聚合根对象的记录变更和对应的值对象的差异变更,实现用户无感轻松实现保存完整对象树
聚合根保存能带来什么好处
用干净整洁的代码换来复杂的关系数据保存
本章节demo请点击链接 https://github.com/xuejmnet/eq-doc
聚合根保存流程

概念
在开始进入聚合根保存前我们需要先了解几个概念
聚合根
a
和b
两张表用a
的主键去关联b
那么a
就是聚合根,b
就是值对象
一句话用自己的主键作为关联关系,那么自己就是聚合根而目标导航就是值对象或者其他
值对象
a
和b
两张表用a
的主键去关联b
那么a
就是聚合根,b
就是值对象
当前对象的关联导航targetProperty为目标表的主键,那么当前表就是目标表的值对象
值对象有两种
- 级联为null,这种值对象不会继续递归遍历下级导航属性,这种值对象在聚合根保存的时候只有update 关联键的份永远不会出现
insert
和delete
- 级联删除,这种值对象是真正的值对象,是被当前聚合根驱动,并且会往下遍历导航属性,并且存在
insert
,update
,delete
三种状态
其他关系
非主键比如其他column进行两张表之间关联,或者是多对多无中间表又或者是path路径左匹配这种我们认为是其他关系
级联脱钩选项
@Navigate
的属性cascade
拥有如下几种枚举
类型 | 功能 |
---|---|
AUTO | 涉及到对象脱钩操作,系统自动处理,默认采用set null ,如果是多对多操作中间表则无法确定需要用户自行处理 |
NO_ACTION | 脱钩不做任何处理用户自行处理 |
SET_NULL | 脱钩处理设置targetProperty为null,对目标记录不进行删除 |
DELETE | 脱钩处理设置时将目标对象删除比如user 和user_role 和role 那么user_role 可以设置为delete |
savable能带来什么
在没有savable的时候我们创建多对多关系需要创建user,user_role,role,并且需要对user的id赋值然后给role的id赋值,给user_role的userId和roleId赋值,这是新增需要考虑的
如果是修改则需要找出哪些需要新增,哪些需要删除,哪些需要修改,甚至如果暴力一点只能把user_role全部删除然后重新新增,但是这样会导致user_role的id变更掉,假如user_role是一张带有业务字段的中间表则这种删除后新增的方式将不再适用
有了save后我们可以怎么做呢
private final EasyEntityQuery easyEntityQuery;
@PostMapping("/create")
@Transactional(rollbackFor = Exception.class)
@EasyQueryTrack
public Object create() {
ArrayList<SysRole> sysRoles = new ArrayList<>();
{
SysRole sysRole = new SysRole();
sysRole.setName("管理员");
sysRole.setCreateTime(LocalDateTime.now());
sysRoles.add(sysRole);
}
{
SysRole sysRole = new SysRole();
sysRole.setName("游客");
sysRole.setCreateTime(LocalDateTime.now());
sysRoles.add(sysRole);
}
SysUser sysUser = new SysUser();
sysUser.setName("小明");
sysUser.setAge(18);
sysUser.setCreateTime(LocalDateTime.now());
sysUser.setSysRoleList(sysRoles);
easyEntityQuery.savable(sysRoles).executeCommand();
easyEntityQuery.savable(sysUser).executeCommand();
return "ok";
}
我们只需要创建user和role,然后分别对其进行保存即可,我们来看生成的sql
==> Preparing: INSERT INTO `t_role` (`id`,`name`,`create_time`) VALUES (?,?,?)
==> Parameters: 1a4c554e4b8b4cff81c87d9298b853ed(String),管理员(String),2025-09-11T22:35:31.143878(LocalDateTime)
==> Preparing: INSERT INTO `t_role` (`id`,`name`,`create_time`) VALUES (?,?,?)
==> Parameters: bb9278911ecb4fe19c8a41a4e26a7c06(String),游客(String),2025-09-11T22:35:31.143909(LocalDateTime)
==> Preparing: INSERT INTO `t_user` (`id`,`name`,`age`,`create_time`) VALUES (?,?,?,?)
==> Parameters: 2164d097983b4874859b01ef02f53340(String),小明(String),18(Integer),2025-09-11T22:35:31.143932(LocalDateTime)
==> Preparing: INSERT INTO `t_user_role` (`id`,`user_id`,`role_id`) VALUES (?,?,?)
==> Parameters: b588a3ce9c72484fba366ce7288d8f5c(String),2164d097983b4874859b01ef02f53340(String),1a4c554e4b8b4cff81c87d9298b853ed(String)
==> Preparing: INSERT INTO `t_user_role` (`id`,`user_id`,`role_id`) VALUES (?,?,?)
==> Parameters: 91b39127ba5d499f9cde6a326a49a71d(String),2164d097983b4874859b01ef02f53340(String),bb9278911ecb4fe19c8a41a4e26a7c06(String)