2012-10-04 5 views
0

가능한 한 간단하고 쉽게 따르도록 고안된 인위적인 예제로 내 문제를 설명하겠습니다. 그러나 내 진짜 문제는 레거시 코드에 있으므로 스키마 또는 아무것도 변경할 수 없습니다.클래스 및 집합 매핑 당 최대 절전 모드 표

내 코드에는 클래스 hiarachy 테이블이 있습니다. Customer1과 Customer2를 말하십시오. 고유 한 판별 자 값을가집니다 (1과 2를 각각 지정). 각 고객은 0 개 이상의 주소를 가질 수 있습니다. 주소는 단일 테이블에 저장됩니다. 이 테이블은 고객 ID 및 고객 판별 자 값에 대한 참조를 저장합니다. 주소 매핑에서 나는 가지고있다 :

<any name="customer" meta-type="CustomerMetaType" id-type="long"> 
    <column name="customerid" not-null="true" /> 
    <column name="discriminator" not-null="true" /> 
</any> 

이것은 괜찮다. 그러나 제 1 고객 및 customer2 매핑에 내가 가진 :이 수정에서 내 최초의 시도가 여러 키를 추가했다 2. ID 1로드 ​​1 고객은 ID로 customer2에 대한 주소를 선택할 것이라고 문제를 가지고

<set name="addresses" outer-join="false"> 
    <key column="customerid"/>    
    <one-to-many class="Address"/> 
</set> 

설정 : 그러나

<key> 
    <column name="customerid"/> 
    <column name="discriminator"/> 
</key> 

나는 다음과 같은 예외가 얻을 일 :

org.hibernate.MappingException : 외래 키가 참조하는 기본 키 열 수가 같아야합니다)를

누구에게도 해결책이 있습니까? 거기 descriminator 가상 합성 키의 일종으로 클래스에 매핑하는 방법이 있나요? 아니면 특정 매핑 테이블을 사용하여 특정 고객 테이블로 제한 할 수 있습니까?

답변

1

각 고객의 매핑이 필요로하는 곳 조건

<set name="addresses" outer-join="false" where="discriminator='customer1'"> 
    <key column="customerid"/>    
    <one-to-many class="Address"/> 
</set> 

<set name="addresses" outer-join="false" where="discriminator='customer2'"> 
    <key column="customerid"/>    
    <one-to-many class="Address"/> 
</set> 
+0

완벽한, 감사합니다! – samblake