Нулевой ключ в Identity Map - PullRequest
       26

Нулевой ключ в Identity Map

0 голосов
/ 30 апреля 2009

У меня есть объект домена, используемый в карте идентификации (ключи - это свойство 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 должно генерироваться на сервере при сохранении нового объекта

Обновление

Спасибо за отзыв. Я действительно хотел бы, чтобы объекты-значения отображались так же, как и сущности: просто потому, что объект-значение не был сохранен, не означает, что у него нет значения, которое можно сопоставить для моего приложения. На самом деле я неправильно понимаю, что такое карта идентификации (которую, после перечитывания определения шаблона, я на самом деле не использую).

Решение, которое я придумал, в значительной степени прямо из ответа Игоря: каждый объект получает случайный идентификатор, назначенный ему при создании экземпляра. Он уникален, неизменен и неизменен в течение всего контекста, в котором живет объект. Он существует как для сущностей из БД, так и для новых экземпляров. Подстройка для сущностей заключается в том, что она соответствует реальной идентичности объекта. Это делает отладку немного проще. Это значение, которое я использую в качестве ключа в сопоставлении.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2009

Что ж, вам нужно будет найти способ отложить добавление объекта на карту до тех пор, пока после того, как не будет сохранено и не назначен идентификатор.

0 голосов
/ 30 апреля 2009

Пока объект не получает идентичность, это просто объект значения . Только после того, как личность установлена, она становится сущностью .

Пока объект не станет сущностью, вы не сможете поместить его в карту идентичности, подобную вашей - это не имеет смысла, поскольку вы не можете вытащить его (поскольку у вас нет уникального ключа для его поиска).

Один из возможных подходов:

  1. Добавить флаг к классу, который указывает состояние объекта (новый / сохраненный).
  2. Реализация временного (на стороне клиента) идентификатора для этих объектов
  3. Дополнительно:
    1. хранит "новые" объекты в отдельной карте идентификации (если вы не можете избежать конфликтов идентификаторов между идентификаторами клиента и сервера)
    2. сохранить "новые" объекты в той же карте идентификации (если вы можете избежать конфликтов идентификаторов между идентификаторами клиента и сервера)
  4. Как только объект будет сохранен, замените идентификатор клиента на идентификатор сервера, установите состояние сохранено, перейдите к главной карте идентификации (если необходимо).

Смотрите здесь о сущностях и объектах-значениях

...