2009-08-25 2 views
4

DDD 및 NHibernate를 처음 사용했습니다.NHibernate에서 값 개체에 대한 별도의 테이블

현재 나의 프로젝트에는 Value 객체를 포함하고있는 Person이라는 엔티티가 있습니다. 주소를 말해 봅시다. 오늘은 괜찮습니다. 하지만 언젠가는 내 가치 객체 (이 경우 Address)가 엔티티가되어야한다는 요구 사항을 갖게 될 것입니다.

DDD 방식으로 모델을 작성하기 전에 더 많은 데이터 중심 접근 방식에서 ID가있는 Person 테이블과 실제로 PK 인 FK 인 다른 테이블 Address가있었습니다. 사람 (즉, 일대일 관계).

값 개체를 구성 요소로 매핑 할 때 그 값이 내 엔터티 테이블의 열로 매핑됩니다 (따라서 일대일 관계가 없음).

내 생각에, 필자는 필요할 때 내 Address 테이블에 대리 키를 추가하기 만하면 엔티티가됩니다.

NHibernate를 사용하여 어떻게 디자인해야합니까? 내 Address 객체를 이미 엔터티로 만들까요?

미안하지만, 내 질문이 명확한 지 모르겠다. 나는 정말로 여기에서 길을 잃었다.

답변

4

우리가 구축하고있는 시스템에서 Value-Objects를 별도의 테이블에 넣습니다. 내가 아는 한, NHibernate는 id이 객체에 추가되어야한다고 요구하지만, 이것을 무시하고 그 객체를 시스템의 Value-Object로 취급한다. 아시다시피 Value Object는 추적 할 필요가없는 개체이므로 개체의 id을 간과합니다. 이렇게하면 원하는 방식대로 데이터베이스를 모델링하고 원하는 방식으로 도메인 모델을 모델링 할 수 있습니다.

+0

동일한 접근법이 여기에 있습니다. ddd는 객체가 id라는 속성을 갖지 말 것을 요구하지 않습니다. 단지 값 객체가 신원이없는 객체라는 것을 알려줍니다. –

+0

흠, 보호 된 ID를 만드는 것은 어떨까요? 그래서 그것을 숨기지 만 NHibernate는 여전히 그것을보고 매핑 할 수 있습니까? –

+2

그러나 값 개체 테이블에 반복되는 항목이 생깁니다. 어떻게 피하는가? – Seiti

0

nHibernate가 엔티티가 아닌 적절한 값 객체로 매핑되도록 해주는 컴포넌트로 결합하여 만들 수 있습니다.

이렇게하면 가상 속성이나 빈 보호 된 ctor (개인용 일 수 있음)가 필요하지 않습니다.

Join("PROPOSAL_PRODUCT", product => 
{ 
    product.Schema(IsaSchema.PROPOSALOWN); 
    product.KeyColumn("PROPOSAL_ID"); 

    product.Component(Reveal.Member<Proposal, Product>("_product"), proposalProduct => 
    { 
     proposalProduct.Map... 
    }); 
}); 
관련 문제