2009-03-02 10 views
2

나는 다음과 같은 개체 모델을 가지고 많은 아이들과 후손NHibernate에 매핑 문제

  • 최상위 추상 클래스 Element.
  • A 클래스 Event.
  • ElementEvents의 자루를 포함한다.
  • Event에는 부모 Element에 대한 포인터가 있습니다.

지금까지 - 예쁜 standart 일대 다 관계.

하지만 테이블 당 구체적인 클래스 전략을 사용하고 싶습니다. 따라서 클래스 Element은 데이터베이스에 매핑되지 않습니다. 이 방법으로 해결하려고 노력했습니다. 각각의 구체적인 자손 은 자체 가방 Event을 정의합니다. 이 문제는 각 <bag> 요소에 <key> 요소가 포함되어 있다는 것입니다. 이 키는 Parent 속성이 Event임을 나타냅니다. 또한 Event 테이블의 Parent 열을 Bag이 들어있는 테이블의 외래 키로 만듭니다! 그러나 하나의 열은 여러 테이블에 대한 외래 키가 될 수 없으며 삽입시 예외가 발생합니다.

나는 또한 Event 테이블의 Parent 필드에 many-to-any 종류의 필드를 만들려고했습니다. 그게 효과가 있었어. 그러나 그 관계를 양방향으로 만들고자 할 때, 즉, Element의 자손에게 가방을 덧붙이고 싶을 때 나는 같은 문제로 돌아온다. Bag => foreign key => insert시 예외.

나는이 케이스가 그렇게 독특하지 않을 것이라고 확신합니다. 도움을 주셔서 감사합니다.

답변

1

조금 늦었지만 조언이 필요합니다.

"concrete per table"을 사용하는 경우 완전히 독립적 인 테이블을 매핑하는 것처럼 보입니다. 따라서 별도의 외래 키 또는 다 대다가 필요합니다.

many-to-any는 형식 이름을 저장하고 NH는 외부 키가 가리키는 위치를 알 수 있습니다. 그러나 외래 키에 제약을 가하는 것은 불가능합니다.

동일한 유형의 항목을 가진 여러 가방이있는 경우, 그들은 모두 서로 다른 외부 키를 정의해야합니다 :

<class name="A"> 
    <!-- ... --> 
    <bag name="Events"> 
    <key column="A_FK"/> 
    <one-to-many class="Event"/> 
    </bag> 
</class> 

<class name="B"> 
    <!-- ... --> 
    <bag name="Events"> 
    <key column="B_FK"/> 
    <one-to-many class="Event"/> 
    </bag> 
</class> 

당신은 외래 키에 대한 외부 키 제한 조건이있을 수 있지만 null이되지 제약 조건을 왜냐하면 이러한 외래 키 중 하나만 사용되기 때문입니다.

실제로 모든 제약 조건이있는 외래 키를 하나만 가지려면 요소를 별도의 테이블에 매핑해야합니다.