知识卡片

依赖映射的适用前提,及与工作单元的冲突

普通读书笔记卡

内容

有些对象天然只在另一个对象的语境里出现——比如加载/保存一张唱片时,它下面的曲目也随之一起被加载/保存;如果这些曲目没有被数据库中任何其他表引用,就可以让唱片的映射器顺带负责曲目的映射,这就是依赖映射。适用的前提有两条硬性要求:每个依赖者必须恰好归属一个所有者;不能有除所有者之外的任何对象持有对依赖者的引用。依赖者因此有个鲜明特征——它没有标识域,不需要进标识映射,也没有能通过ID单独查找它的查找器,所有查找都只能通过所有者进行;这带来一个实现上的便利:既然依赖者的写入完全由所有者代劳、外部也没有引用,更新依赖者集合时可以简单粗暴地”先删光、再全部重新插入”,不需要费心分析集合里到底加了什么、减了什么。作者特别提醒:依赖映射的价值定位是简化数据库映射,而不是面向对象设计本身的核心工具——要警惕依赖关系图过大,因为依赖者无法从外部单独引用,会让”根所有者”的查找机制变得复杂。还有一条更硬核的警告:如果系统用了工作单元,就不建议再用依赖映射——工作单元跟踪的是独立注册的对象,根本不认识依赖者这个概念,”删除并重插入”策略在工作单元语境下帮不上任何忙;作者引用了一个真实案例——某应用的工作单元只记录测试目的插入的行、事后统一删除,但因为它压根不跟踪依赖者,测试运行后留下了孤立行,最终导致测试失败。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第12章 对象-关系结构模式"之"12.4 依赖映射"(源文件:_epub-src/OEBPS/Text/000120.html、000121.html) - 结论依据:原文说明"依赖者的一个重要特性就是它没有标识域……在使用工作单元的时候,建议不要使用依赖映射。如果使用工作单元来跟踪,那么删除和重插入策略根本不会有任何帮助……Mike Rettig曾经提到过一个应用程序……因为它不跟踪依赖者,孤立行出现了,并且在测试运行的时候引起失败",直接支撑本卡结论。 - 原始内容:由于依赖者的写和保存都是由所有者来做,并且没有外部引用,因此对依赖者的更新可以通过删除和插入来处理。