2009-04-29 2 views
0

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

Обновление

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

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

+0

Почему вы хотите, чтобы добавить временные объекты к identitymap? – Paco

+0

@Paco: Это не карта идентичности. Я неправильно понял, что для карты идентичности. Я оставил формулировку вопроса так же, как и для других людей, которые думают, что используют карту идентичности и сталкиваются с этой проблемой. См. Мой комментарий в ответ на http://stackoverflow.com/questions/804041/null-key-in-identity-map/804096#804096 – JPot

ответ

0

До тех пор пока объект не получит удостоверение личности, это всего лишь объект . Только после установления личности он становится лицом.

До тех пор, пока объект не станет сущностью, вы не можете поместить его в карту идентификации, такую ​​как ваша. Это не имеет смысла, поскольку вы не можете ее вытащить (так как у вас нет уникального ключа, чтобы найти его).

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

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

Смотрите здесь о entities vs. value objects

+1

Что с этой ссылкой? Я нахожусь в FF, и когда я нажимаю на него, я получаю 404. Затем я перехожу в адресную строку (все еще на странице 404) и нажимаю [Enter], и она работает. –

+0

Спасибо. См. Мой обновленный вопрос о том, что я решил сделать. Единственное изменение - это последняя часть вашего ответа: после сохранения объекта я не хочу заменять идентификатор клиента идентификатором сервера, так как карта является внешней по отношению к сохранению и не будет знать об обновленном идентификаторе (это не реальная идентификационная карта в смысле «шаблона», я неправильно использовал термин). – JPot

+0

Сущность без идентификатора все еще является сущностью. Сохранение постоянного флага государства в сущности не является хорошей идеей, потому что это не работает с идеей ненасилия настойчивости. – Paco

2

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

+0

В смысле истинного шаблона «Карта идентичности» вы абсолютно правы. Значение, не полученное из домена, не относится к карте. Оказывается, я не использую реальную карту идентичности вообще, а скорее отображение, которое, как полагается, полагается на поле «Id» объекта для поисковых возможностей (против сканирования коллекции). – JPot

Смежные вопросы