Pergunta

Eu tenho um objeto de domínio usado em um Mapa de Identidade (as chaves são de propriedade Id do objeto).

Pseudocódigo:

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

I observar o objeto para me dizer quando ele foi salvo no banco de dados:

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

Para novos objetos no campo Id está vazio e não povoada até que seja salva no banco de dados.

E é aí que reside o meu problema. No caso de novos objetos, a pesquisa "map[domainObj.Id]" falha porque a identidade do objeto foi alterado depois de ser salvo!

Qual é a melhor maneira de usar um objeto em um mapa de identidade como este?

Restrições :

  1. Eu estou usando uma linguagem que não permite que objetos como chaves em um mapeamento [JavaScript]
  2. O campo Id deve ser gerado no servidor ao salvar um novo objeto

Atualizar

Obrigado pelo feedback. Eu realmente gostaria de ter objetos de valor mapeados da mesma forma que entidades: só porque o objeto de valor não foi salvo não significa que ele não tem um valor para mapear para a minha candidatura. Estou de fato mis-compreensão do que um mapa de identidade é (que, depois de reler a definição padrão, não é que eu não estou realmente usando).

A solução que eu vim com é praticamente em linha reta de resposta de Igor: cada objeto recebe um id aleatório atribuído a ele sobre instanciação. Ele é único, imutável e inalterável durante o tempo de vida do contexto em que vive o objeto. Ele está lá para ambas as entidades do db e novas instâncias. O ajuste para entidades é que ele está definido para coincidir com a identidade real do objeto. Isso faz com que a depuração de um pouco mais fácil. Este é o uso I valor como a chave no mapeamento.

Foi útil?

Solução

Até um objeto recebe a identidade, é apenas um valor do objeto . Só depois a identidade foi estabelecida torna-se um entidade .

Até o objeto se torna uma entidade você não pode realmente colocá-lo em um mapa de identidade como a sua -. Não faz sentido, já que você não pode retirá-lo (desde que você não tem uma chave única para encontrá-lo)

Uma abordagem possível:

  1. Adicionar um sinalizador para a classe que indica o estado do objeto (nova / salvo).
  2. Implementar um (do lado do cliente) temporária ID para estes objetos
  3. Opcional:
    1. manter "novos" objetos em um separado mapa de identidade (se você não pode conflitos evitar ID entre IDs de cliente e servidor)
    2. manter "nova" objetos na mesma mapa de identidade (se você pode conflitos evitar ID entre IDs de cliente e servidor)
  4. Uma vez que o objeto foi salvo, substituir o ID do cliente com o ID do servidor, defina o estado a salvo, mudança para o mapa de identidade principal (se necessário).

Veja aqui sobre os entidades vs. valor objetos

Outras dicas

Bem, você vai ter que encontrar uma maneira de adiar a adicionando o objeto para o mapa até que após foi salvo e atribuído um ID.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top