2012-10-04 79 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> 

這很好。然而,在我的customer1表和映射的customer2我:

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

這樣做的問題是ID爲1加載customer1表將拿起的customer2任何地址與ID 2.我在一個固定的初始嘗試是添加多個鍵設定:

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

但是這樣做,我得到以下異常時:

org.hibernate.MappingException:外鍵必須有相同數量的引用的主鍵列)

有沒有人有解決這個問題。有沒有一種將描述符映射爲類的方法,如某種虛擬組合鍵?還是有什麼我可以做的設置映射限制到特定的客戶表?

回答

1

每個客戶映射需要一個where條件

<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