工作机制
示例
说明:保存一张唱片时,需要把与这张唱片相连的艺术家ID保存在这条唱片记录中。
若一张唱片有多个曲目对象相连,由于不能直接保存这些对象到数据库中,因此必须颠倒引用的方向,把外键放到曲目记录中。下面分三种情况:删除和插入;加入后向指针;区分对象集
删除和插入
- 需要删除数据库中与这个唱片相连的所有曲目记录,然后再把唱片中的所有当前曲目记录插入进来。缺点:必须是依赖映射,即曲目只能被唱片所拥有。
- 加入后向指针
放置一个从曲目向后指向唱片的链接,相当于双向关联,虽然改变了对象模型,但可以采用单值域做简单处理。
- 区分对象集
- 通过数据库当前状态来区分:从数据库中重新读出对象集合与唱片中读出的对象集合做比较。删除数据库中那些不在唱片集合中的记录,保存唱片中那些数据库中不存在的记录。
- 通过第一次读取的数据区分:保存读取的数据。优点:避免了另一次数据库读取。
关联对象集的改变
要删除关联对象集对应的记录,前提:强制向后连接,即一个曲目都一张唱片对应:
对于任何要新增到关联对象集的东西:
关联对象集的改变:避免循环
解决方法:
对完整构造数据进行处理,利用延迟加载。
创建空对象,并立即放入标识映射中。这种情况下允许循环,但空对象导致循环终止,在加载过程的结尾对空对象进行处理。优点:避免对延迟加载进行特殊处理。
使用时机
由于外键是单值的,不适合多对多映射,多对多的情况见关联表映射。
示例-单值引用(Java)
最简单的情况-一个艺术家只有一个唱片
从数据库中查找唱片并构造唱片对象
更新一张唱片
示例-多表查询(Java)
为了减少调用次数,优化上面例子。方法:在一次查询中从多个表中得到信息。
Step1 :修改SQL
Step2 :修改加载方法
示例-引用集合(C#)
发生在当一个域是一个集合的情况。采用团队和队员的例子,并假设不给队员使用依赖映射。
查找
更新