在更新地址流程里,仅需要修改 Address 和 Order 两组实体 。
为了满足不同的业务场景,Repository 需要具备两个高级特性:
- 延迟加载 。只有在第一次访问关联实体时才对其进行加载,避免过早加载但实际上并没有使用所造成资源浪费问题;
- 按需更新 。不管加载了多少组实体,在保存时仅对发生变更的实体进行更新,减少对底层存储引擎的操作次数,从而提升性能;
- 支持组合关系
- 支持继承关系
- 支持延迟加载
- 支持按需更新
3.1. 组合关系组合是一种面向对象编程的重要概念,指一个类的对象可以将其他类的对象作为自己的组成部分 。组合在DDD中使用场景最为广泛,这也是聚合的主要工作方式 。也就是将一组对象保存到存储引擎,然后在从存储引擎中获取完整的对象组 。
从数据视角,组合关系存在两个维度:
- 数量维度 。指关联关系两端对象的数量,包括
- 一对一:一个实体对象只能关联到另一个实体对象,例如 公司 和 营业执照,一个公司只会有一个营业执照;
- 一对多:一个实体对象可以关联到多个实体对象,例如 订单 和 订单项,一个订单关联多个订单项;
- 多对一:多个实体对象可以关联到同一个实体对象,例如 订单项 和 订单,一个订单项只属于一个订单;
- 多对多:多个实体对象可以互相关联,例如 社团 和 学生,一个社团包含多个学生,一个学生也可以参加多个社团;
- 方向维度 。指对象的引用关系
- 单向关联,只能从一端访问另一端,比如 订单存在订单项的引用,订单项没有到订单的引用;
- 双向关联,可以互相访问,订单存在订单项的引用,订单项也有到订单的引用;
- 单向多对一
- 双向多对一
- 单向一对多
- 双向一对多
- 单向一对一
- 双向一对一
- 单向一对一
- 单向一对多
实体如下:
// 聚合根实现@Entity@Table(name = "order_info")public class Order{@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;// 增加 @.NEToOne 注解@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)private Pay pay;// 增加 @OneToOne 注解@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)private Address address;// 忽略其他属性}// Pay 实体实现@Entity@Table(name = "pay_info")public class Pay {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;// 忽略其他属性}// Address 实现@Entity@Table(name = "address")public class Address {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;// 忽略其他属性}
插入记录后,order_Infor 表数据如下推荐阅读
- 解密MongoDB的数据分片策略与负载均衡:构建可伸缩的数据库
- 深度解密大模型的“军火商”,向量数据库的八大技术方向!
- 解密成功程序员的秘密武器
- 解密《穿普拉达的女王》,突破刻板印象,绽放女性职场之光
- 无头浏览器解密:全面了解这个神秘的工具
- 企业服务器数据库中了_locked勒索病毒怎么解密,_locked勒索病毒简介与防护
- OpenAI API新功能解密:成本大幅下降,体验感飙升
- DDD实战 - Repository模式的妙用
- 为什么从 MVC 到 DDD,架构的本质是什么?
- DDD 中关于应用架构的那些事