2009-04-29 6 views
0

ID 맵에 사용 된 도메인 개체가 있습니다 (키는 개체의 Id 속성 임).ID 맵의 Null 키

의사 코드 : 새로운 객체의 경우

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

Id 필드가 비어과 때까지 채워되지 않습니다 :이 데이터베이스에 저장되어있는 경우

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

내가 말해 줄 수있는 개체를 관찰 데이터베이스에 저장됩니다.

그리고 내 문제가 있습니다. 새 개체의 경우 저장 후 개체의 ID가 변경 되었기 때문에 조회 "map[domainObj.Id]"이 실패합니다!

이와 같이 ID 맵에서 개체를 사용하는 가장 좋은 방법은 무엇입니까?

제약 :

  1. 나는 매핑 키 등의 개체를 허용하지 않는 언어를 사용하고 [자바 스크립트] 새를 저장할 때 Id 필드 해야 서버에서 생성 할 수
  2. 객체

업데이트

의견에 감사드립니다. 엔티티와 같은 방식으로 값 객체를 매핑하고 싶습니다. 값 객체가 저장되지 않았기 때문에 내 응용 프로그램에 매핑 할 값이 없다는 것을 의미하지는 않습니다. 나는 실제로 신원 맵이 무엇인지 잘못 이해하고있다. (패턴 정의를 다시 읽은 후에, 나는 진정으로 사용하지 않는다).

Igor의 답변에서 알 수 있듯이 해결책은 각 인스턴스마다 인스턴스화시 임의의 ID가 할당됩니다. 객체가 존재하는 맥락의 수명 동안 독특하고 불변이며 변화가 없다. 그것은 db와 새로운 인스턴스화의 두 엔티티 모두를위한 것입니다. 엔티티의 조정은 객체의 실제 ID와 일치하도록 설정된다는 것입니다. 이것은 디버깅을 좀 더 쉽게 만듭니다. 이것은 매핑에서 키로 사용하는 값입니다.

+0

에 대한 이유는 identitymap에 과도 개체를 추가 하시겠습니까보기? – Paco

+0

@Paco : 아이덴티티 맵이 아닙니다. 아이덴티티 맵의 유즈 케이스를 오해했습니다. 나는 아이덴티티 맵을 사용하고 있다고 생각하는이 사람들에게 질문 문구를 남겨 두었다. http://stackoverflow.com/questions/804041/null-key-in-identity-map/804096#804096 – JPot

답변

0

개체가 ID를 가져올 때까지 값 개체 일뿐입니다. 신원이 확인 된 후에 만 ​​엔티티이됩니다.

객체가 엔티티가 될 때까지는 자신의 것과 같은 ID 맵에 실제로 넣을 수 없습니다. (고유 키가 없기 때문에) 객체를 꺼낼 수 없으므로 이해가되지 않습니다.

한 가지 가능한 방법 :

  1. 는 개체의 상태를 나타내는 클래스에 플래그를 추가 (신규/저장).
  2. 옵션 개체에 대한 임시 (클라이언트 측) ID 구현하십시오 별도의 정체성 맵에서
    1. 유지 "새로운"객체 (만약 당신이 할 수있는 클라이언트와 서버 사이하지 피하기 ID 충돌 아이디)
    2. 합니다 (같은 정체성 맵에서 "새로운"객체를 유지 만약 당신이 할 수있는 클라이언트와 서버 ID 사이에 피하기 ID 충돌)
  3. 일단 개체가 저장되면 클라이언트 ID를 서버 ID로 바꾸고 상태를 saved로 설정하고 주 ID 맵 (필요한 경우)으로 이동하십시오.

여기 entities vs. value objects

+1

그 링크는 무엇입니까? 나는 FF로되어 있는데, 클릭하면 404가 나오고 404 페이지의 주소 표시 줄을 클릭하고 [Enter] 키를 누르면 작동합니다. –

+0

감사합니다. 내가 뭘했는지에 대한 업데이트 된 질문을 참조하십시오. 유일한 변경 사항은 답변의 마지막 부분입니다. 일단 개체가 저장되면지도가 저장 외부에 있고 업데이트 된 ID에 대해 알지 못하기 때문에 클라이언트 ID를 서버 ID로 바꾸고 싶지 않습니다. 그것은 "패턴"의 의미에서 실제 신원 맵이 아니며, 용어를 잘못 사용했습니다. – JPot

+0

Id가없는 엔티티는 여전히 엔티티입니다. 엔터티에 영구 상태 플래그를 유지하는 것은 좋은 생각이 아닙니다. 지속성 무지라는 아이디어와 함께 작동하지 않기 때문입니다. – Paco

2

이후에 객체를지도에 추가하는 것을 연기해야 ​​할 방법을 찾아야합니다.이 객체는 저장되고 ID가 할당됩니다.

+0

에 대한 응답으로 내 의견보기 진정한 "Identity Map"패턴의 의미에서 당신은 옳습니다. 도메인에서 검색되지 않은 값은 맵에 속하지 않습니다. 밝혀졌습니다. 실제 신원 맵을 사용하지 않고, 조회 성능상의 이유로 (오브젝트 스캔과 비교하여) 오브젝트의 "ID"필드에 의존하는 맵핑입니다. – JPot