1

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

伪代码:

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

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

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

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

这就是我的问题。在新对象的情况下,查找“ map[domainObj.Id]”失败,因为对象的身份在保存后发生了变化!

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

约束

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

更新

感谢您的反馈。我真的很想让值对象以与实体相同的方式映射:仅仅因为值对象尚未保存并不意味着它没有要映射到我的应用程序的值。事实上,我误解了身份映射是什么(在重新阅读模式定义后,我发现我并没有真正使用它)。

我想出的解决方案几乎直接来自 Igor 的回答:每个对象在实例化时都会获得一个分配给它的随机 id。它在对象所在的上下文的生命周期内是唯一的、不可变的和不变的。它适用于数据库中的实体和新的实例化。实体的调整是它被设置为匹配对象的真实身份。这使得调试更容易一些。这是我在映射中用作键的值。

4

2 回答 2

2

好吧,您必须找到一种方法来推迟将对象添加到地图中,直到被保存并分配一个 ID。

于 2009-04-29T20:22:39.817 回答
1

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

在对象成为实体之前,您不能真正将其放入像您这样的身份映射中 - 这没有任何意义,因为您无法将其拉出(因为您没有唯一的密钥来找到它)。

一种可能的方法:

  1. 向类添加一个标志,指示对象的状态(新/已保存)。
  2. 为这些对象实现一个临时(客户端)ID
  3. 选修的:
    1. 将“新”对象保存在单独的身份映射中(如果您无法避免客户端 ID 和服务器 ID 之间的 ID 冲突)
    2. 将“新”对象保留在同一个身份映射中(如果您可以避免客户端 ID 和服务器 ID 之间的 ID 冲突)
  4. 保存对象后,将客户端 ID 替换为服务器 ID,将状态设置为已保存,移动到主身份映射(如有必要)。

有关实体与值对象的信息,请参见此处

于 2009-04-30T05:25:26.610 回答