문제

Identity Map에 사용 된 도메인 객체가 있습니다 (키는 객체의 것입니다. 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 필드 ~ 해야 하다 새 개체를 저장할 때 서버에서 생성됩니다.

업데이트

피드백을 주셔서 감사합니다. 나는 실제로 값 객체를 엔티티와 같은 방식으로 매핑하고 싶습니다. 값 객체가 저장되지 않았다고해서 응용 프로그램을 위해 맵핑 할 값이 없다는 것을 의미하지는 않습니다. 나는 실제로 Identity Map이 무엇인지 잘못 이해하고 있습니다 (패턴 정의를 다시 읽은 후에는 진정으로 사용하지 않는 것이 밝혀졌습니다).

내가 생각해 낸 해결책은 Igor의 답변에서 거의 직접입니다. 각 객체는 인스턴스화시 임의의 ID를 할당합니다. 그것은 대상이 사는 맥락의 수명 동안 독특하고 불변이며 변하지 않습니다. 그것은 DB의 두 엔티티와 새로운 인스턴스화에 있습니다. 엔티티의 조정은 객체의 실제 정체성과 일치하도록 설정되어 있다는 것입니다. 이로 인해 디버깅이 조금 쉬워집니다. 이것이 매핑에서 키로 사용하는 값입니다.

도움이 되었습니까?

해결책

물체가 정체성을 얻을 때까지 가치 객체. 신원이 확립 된 후에 만 실재.

객체가 엔티티가 될 때까지 당신은 실제로 그것을 당신의 것과 같은 신원지도에 넣을 수 없습니다. 그것을 꺼낼 수 없기 때문에 (그것을 찾을 수있는 고유 한 키가 없기 때문에) 의미가 없습니다.

가능한 한 가지 방법 :

  1. 객체의 상태를 나타내는 클래스에 플래그를 추가하십시오 (신규 / 저장).
  2. 이 개체에 대한 임시 (클라이언트 측) ID 구현
  3. 선택 과목:
    1. "새"개체를 a 분리된 신원지도 (당신이 할 수 없습니다 클라이언트와 서버 ID 간의 ID 충돌을 피하십시오)
    2. "새로운"개체를 보관하십시오 같은 신원지도 (당신이 ~할 수 있다 클라이언트와 서버 ID 간의 ID 충돌을 피하십시오)
  4. 객체가 저장되면 클라이언트 ID를 서버 ID로 바꾸고 상태를 저장하도록 설정하고 주 ID 맵 (필요한 경우)으로 이동하십시오.

여기에 대해 참조하십시오 엔티티 대 가치 대상

다른 팁

글쎄, 당신은지도에 객체를 추가하는 것을 연기하는 방법을 찾아야합니다. ~ 후에 저장 및 ID를 할당했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top