身份图中的空键

时间:2009-04-29 20:08:59

标签: design-patterns data-modeling orm

我在身份映射中使用了一个域对象(键是对象的Id属性)。

伪代码:

map = new Mapping();
map[domainObj.Id] = 'foo';

我观察对象告诉我何时将其保存到数据库中:

domainObj.bind('saved', function() {
    map[domainObj.Id] = 'new foo!'
})

对于新对象,Id字段为空,在将其保存到数据库之前不会填充。

这就是我的问题所在。对于新对象,查找“map[domainObj.Id]”失败,因为对象的标识在保存后已更改!

在这样的身份地图中使用对象的最佳方法是什么?

约束

  1. 我使用的语言不允许对象作为映射[JavaScript]
  2. 中的键
  3. 保存新对象时,必须在服务器上生成Id字段

  4. 更新

    感谢您的反馈。我真的希望以与实体相同的方式映射值对象:仅仅因为没有保存值对象并不意味着它没有映射到我的应用程序的值。事实上,我错误地理解了身份图是什么(在重新阅读模式定义之后,事实证明我并没有真正使用它。)

    我提出的解决方案非常直接来自Igor的答案:每个对象在实例化时都会获得一个随机id。它在对象所处的上下文的生命周期中是独特的,不可变的和不变的。它存在于db和new实例中的两个实体。实体的调整是它被设置为匹配对象的真实身份。这使调试更容易一些。这是我用作映射中的键的值。

2 个答案:

答案 0 :(得分:2)

好吧,你必须找到一种推迟将对象添加到地图的方法,直到 之后保存并分配了一个ID。

答案 1 :(得分:0)

在对象获得标识之前,它只是一个值对象。只有在身份确定后,它才会成为实体

直到对象成为一个实体,你才能真正把它放在像你这样的身份地图中 - 它没有意义,因为你无法将它拉出来(因为你没有一个唯一的密钥来找到它)。 / p>

一种可能的方法:

  1. 在类中添加一个标志,指示对象的状态(新建/已保存)。
  2. 为这些对象实施临时(客户端)ID
  3. 可选
    1. 将“新”对象保留在单独的身份映射中(如果不能避免客户端和服务器ID之间的ID冲突)
    2. 相同身份地图中保留“新”对象(如果您可以避免客户端和服务器ID之间的ID冲突)
  4. 保存对象后,将客户端ID替换为服务器ID,将状态设置为已保存,移至主身份映射(如有必要)。
  5. 请点击此处了解entities vs. value objects