2013-03-19 4 views
5

Many-To-Many 관계를 일대 다 관계로 바꿀 수있는 인터넷 게시물을 읽었습니다. (더 이상 해당 게시물을 찾을 수 없습니다.) 누군가가 모범을 보일 수 있습니까?Nhibernate : 일대 다 관계로 다 대 다 관계를 표현하는 방법?

+0

테이블과 사용할 수업을 설명해주십시오. – cremor

+3

관계형 DBMS는 일반적으로 다 대다 관계를 지원하지 않으므로 이러한 관계는 연결 테이블과 두 개의 일대 다 관계를 사용하여 표시됩니다. 예를 들어'User's와'Role's의 many-to-many 관계는'User one-to-many UserRoles many-to-one role'으로 표현됩니다. Hibernate는 대개 이것을 숨기고 many-to-many relationshops를 투명하게 허용한다. 원하는 경우 항상 연결 테이블을 명시 적으로 매핑하도록 선택할 수 있습니다. 'User','Role' _and_'UserRoles'를 매핑 할 것입니다. 여기에서'UserRoles'는 두개의 many-to-one 관계를 포함합니다 (각각'User'와'Role'). –

+0

(계속)이 경우'User'도'Role'도'UserRoles' 인스턴스의 콜렉션 (일대 다)을 보유 할 필요가 없습니다 (또는 적어도 역으로 될 수 있습니다). 이는 메모리에 콜렉션을 적게로드해야하기 때문에 메모리 사용량을 줄이는 데 유용 할 수 있습니다. 단점은 쿼리가 더욱 복잡해진다는 점입니다. –

답변

11

나는 그 질문에 다가 서서 답을 놓치고 있다는 것을 깨달았다. 그리고 나는 종종이 NHibernate 설명서를 지적하지만, 수치 스럽습니다. 24. Best Practices

이국적인 연관 매핑을 사용하지 마십시오.

실제 다 대다 연관을위한 좋은 사례는 거의 없습니다. 의 대부분은 "링크 테이블"에 저장된 추가 정보가 필요할 때입니다. 이 경우 중간 링크 클래스 에 두 개의 일대 다 연관을 사용하는 것이 훨씬 더 좋습니다. 실제로 우리는 대부분의 협회 이 일대 다 다기간 방식이라고 생각합니다. 다른 협회 스타일을 사용할 때는 조심해야하며 실제로 필요한지 스스로에게 물어보십시오.

23.2. Author/Work 아래의 예를 살펴보십시오. 추출, AuthorWork 사이의 many-to-many 관계의 단순화 된 버전 :

<class name="Work" table="works" ...> 
     <id name="Id" column="id" generator="native" /> 
     ... 
     <set name="Authors" table="author_work" lazy="true"> 
      <key> 
       <column name="work_id" not-null="true"/> 
      </key> 
      <many-to-many class="Author"> 
       <column name="author_id" not-null="true"/> 
      </many-to-many> 
     </set> 
</class> 

과 다 대다 대상 저자 :

<class name="Author" table="authors"> 
    ... 
    <set name="Works" table="author_work" inverse="true" lazy="true"> 
    <key column="author_id"/> 
    <many-to-many class="Work" column="work_id"/> 
    </set> 
</class> 

그래서, 우리는 주문하고자하는 경우 작품 세트가로드되면 문제가 발생합니다. 쌍 테이블에는 열이 없습니다. 그러나 더 중요한 것은 그러한 열을 관리하는 방법이 없다는 것입니다.

우리가 할 수있는 일의 쌍 객체 도입하는 것입니다 AuthorWork를이 우리가 많은 -을 변환 할 수 있습니다 갖는 AuthorWork

<class name="AuthorWork" table="author_work"> 
    ... 
    <many-to-one name="Author" column="author_id" /> 
    <many-to-one name="Workr" column="work_id" /> 
    <property name="OrderBy" /> 

public class AuthorWork 
{ 

    public virtual Author Author { get; set; } 
    public virtual Work Work { get; set; } 
    public virtual int OrderBy { get; set; } 
} 

매핑을 필요에 따라 쌍 테이블을 확장 예를 들어 Authors 컬렉션과 같은 일대 다 매핑을 사용합니다.

우리는 엔티티 AuthorWork를 관리하고, OrderBy 열을 설정하며, 따라서 페어링 테이블을 효과적으로 사용할 수 있습니다.

참고 : 문서의 제안에 동의해야합니다. 요구 사항이 많을수록 관계를 관리하는 방법이 더 행복해집니다!

+4

모범 사례 링크가 올라갔습니다 : http://nhibernate.info/doc/nh/en/index.html#example-mappings-authorwork – mcfea

관련 문제