2016-06-22 3 views
0

PET, CAT 및 EXTENSION.CAT의 세 테이블이있는 데이터베이스를 고려하십시오. 여기서 Pet는 Cat의 기본 클래스이고 Extension.Cat에는 추가 속성이있는 확장 테이블이 포함되어 있습니다 고양이를 위해서. 나는 다음과 같은 작업을해야, 그것은 아무튼 가정 거라고하지만, 그래서NHibernate를 사용하여 클래스 별 다중 조인 테이블 전략을 매핑하는 방법

<class name="Cat" table="CAT"> 
    <id name="id" column="ID">...</id> 
    <property name="isMouser"/> 
    <join table="CAT" schema="EXTENSION" > 
     <key column="ID"/> 
     <property name="fuzziness"/> 
     <property name="cuteness"/> 
    </join> 
</class> 

: - CatEx의이 같은 관계

<class name="Pet" table = "PET"> 
    <id name="id" column="ID">...</id> 
    <property name="name"/> 
    <property name="age"/> 
    <joined-subclass name="Cat" table="CAT"> 
     <key column="ID"/> 
     <property name="isMouser"/> 
    </joined-subclass> </class> 

와 고양이 : 이런 식으로 뭔가를 사용하여 고양이의 관계 - 자 NHibernate는 애완 동물을 모델링 허용 't :

<class name="Pet" table = "PET"> 
    <id name="id" column="ID">...</id> 
    <property name="name"/> 
    <property name="age"/> 
    <joined-subclass name="Cat" table="CAT"> 
     <key column="ID" /> 
     <property name="isMouser"/> 
     <join table="CAT" schema="EXTENSION" > 
      <key column="ID"/> 
      <property name="fuzziness"/> 
      <property name="cuteness"/> 
     </join> 
    </joined-subclass> 
</class> 

Nhibernate 설명서에는이 시나리오가 설명되어 있지 않습니다. 클래스 당 다중 테이블을 모델링하는 적절한 방법은 무엇입니까?

답변

0

이 시나리오를 모델링하는 올바른 방법은 암시 적 다형성 패턴을 사용하는 것입니다.

<class name="Cat" table = "PET"> 
    <id name="id" column="ID">...</id> 
    <property name="name"/> 
    <property name="age"/> 
    <join table="CAT"> 
     <key column="id"/> 
     <property name="isMouser"/> 
    </join> 
    <join table="CAT" schema="EXTENSION" > 
     <key column="id"/> 
     <property name="fuzziness"/> 
     <property name="cuteness"/> 
    </join> 
</class> 

여기서 중요한 점은 부모 테이블 (PET)이 참조 된 첫 번째 테이블이라는 점입니다.하지만 우리는 Cat 클래스를 모델링하고 있습니다. 이 시나리오는 효과적으로 파생 클래스 당 여러 테이블을 제공합니다.

잠재적 인 문제 중 하나는 조인 열 이름이 일치하지 않고 매핑 된 클래스에 자식 테이블 열 속성이있는 경우입니다. Hibernate는 이러한 부가적인 클래스 프로퍼티가 매핑을 필요로한다. 자식 테이블의 속성에 "generated = insert", "insert = false", "update = false"속성을 추가하면 NHibernate가 속성을 읽기 전용으로 설정합니다.

<class name="Cat" table = "PET"> 
    <id name="petid" column="PETID">...</id> 
    <property name="name"/> 
    <property name="age"/> 
    <join table="CAT"> 
     <key column="catid"/> 
     <property name="isMouser"/> 
     <property name="catid" generated="insert" insert="false" update="false" /> 
    </join> 
    <join table="CAT" schema="EXTENSION" > 
     <key column="catexid"/> 
     <property name="fuzziness"/> 
     <property name="cuteness"/> 
     <property name="catexid" generated="insert" insert="false" update="false" /> 
    </join> 
</class>