设计模式-外键映射(Foreign Key Mapping)

工作机制

示例
说明:保存一张唱片时,需要把与这张唱片相连的艺术家ID保存在这条唱片记录中。

若一张唱片有多个曲目对象相连,由于不能直接保存这些对象到数据库中,因此必须颠倒引用的方向,把外键放到曲目记录中。下面分三种情况:删除和插入;加入后向指针;区分对象集

删除和插入

  • 需要删除数据库中与这个唱片相连的所有曲目记录,然后再把唱片中的所有当前曲目记录插入进来。缺点:必须是依赖映射,即曲目只能被唱片所拥有。
  • 加入后向指针

放置一个从曲目向后指向唱片的链接,相当于双向关联,虽然改变了对象模型,但可以采用单值域做简单处理。

  • 区分对象集
  1. 通过数据库当前状态来区分:从数据库中重新读出对象集合与唱片中读出的对象集合做比较。删除数据库中那些不在唱片集合中的记录,保存唱片中那些数据库中不存在的记录。
  2. 通过第一次读取的数据区分:保存读取的数据。优点:避免了另一次数据库读取。

关联对象集的改变

要删除关联对象集对应的记录,前提:强制向后连接,即一个曲目都一张唱片对应:

对于任何要新增到关联对象集的东西:

关联对象集的改变:避免循环

解决方法:
对完整构造数据进行处理,利用延迟加载。
创建空对象,并立即放入标识映射中。这种情况下允许循环,但空对象导致循环终止,在加载过程的结尾对空对象进行处理。优点:避免对延迟加载进行特殊处理。

使用时机

由于外键是单值的,不适合多对多映射,多对多的情况见关联表映射

示例-单值引用(Java

最简单的情况-一个艺术家只有一个唱片

从数据库中查找唱片并构造唱片对象

更新一张唱片

示例-多表查询(Java

为了减少调用次数,优化上面例子。方法:在一次查询中从多个表中得到信息。

Step1 :修改SQL

Step2 :修改加载方法

示例-引用集合(C#)

发生个域是一个集合的情况。采用团队和队员的例子,并假设不给队员使用依赖映射。

查找

更新

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值