MDriven中UML类关联的Embed标记适用端及设置原因咨询
关于MDriven中关联Embed标识的使用场景与原因
我在MDriven里处理过不少领域模型的关联设置,这个带(e)的embed标识核心是绑定对象的生命周期与持久化方式,下面给你拆解清楚什么时候该用,以及背后的逻辑:
适合设置Embed的场景(哪端设?看谁依附谁)
Embed的核心规则是:被嵌入的对象没有独立生命周期,完全依附于关联另一端的主对象,所以要把从属对象那一端设为embed。
1. 值对象(Value Object)关联
比如你定义了User类和Address类,Address本身没有单独存在的意义——没有对应的User,这个Address就毫无价值。这时候把Address这一端的关联设为embed。
- 原因:值对象的设计初衷就是作为主对象的属性集合存在,不应该被单独持久化。MDriven设置embed后,会把
Address作为User的一部分存储,删除User时Address会自动被清理,而且你无法单独查询或修改Address,必须通过所属的User操作,完全符合值对象的设计原则。
2. 聚合内的从属对象
比如电商系统里的Order和OrderItem,OrderItem只能属于某一个特定的Order,不能被多个Order共享,也不能脱离Order存在。这时候把OrderItem端设为embed。
- 原因:这契合DDD的聚合设计思想——聚合根(这里是
Order)负责管理聚合内所有从属对象的生命周期。MDriven会将Order和它的所有OrderItem作为一个整体处理,避免出现孤立的OrderItem数据,同时提升持久化时的效率。
3. 紧密绑定的小型附属对象
比如Product关联的ProductThumbnail(存储缩略图的元数据和二进制内容),这个ProductThumbnail完全为Product服务,不会被其他对象引用或单独使用。这时候把ProductThumbnail端设为embed。
- 原因:减少持久化时的关联查询开销,embed的对象会和主对象存储在同一个数据单元中(比如数据库的同一张表,或者文档型数据库的嵌套文档),读取主对象时能一次性加载所有embed对象,提升系统性能。
绝对不能用Embed的场景
- 对象有独立生命周期:比如
User和Role,Role可以被多个User共享,即使某个User被删除,Role依然需要存在。这种场景下绝对不能把Role设为embed。 - 需要单独操作关联对象:比如你要统计所有
Address中的城市分布,或者单独修改某个Address的信息,如果Address是embed的,你无法直接查询或操作它,这种场景就不能用embed。
另外提一句:你输入多重性后自动出现(e),大概率是不小心触发了MDriven的快捷设置,你可以右键点击关联端,在菜单里去掉embed选项,或者在属性面板中调整Embed的勾选状态。
内容的提问来源于stack exchange,提问作者Joe Andersson
相关产品推荐
相关产品推荐

