Hibernate Table Per Class&设置映射

时间:2012-10-04 14:45:43

标签: hibernate mapping set table-per-class

我将用一个人为的例子来说明我的问题,尽量让它尽可能简单易懂。然而,我真正的问题是在遗留代码中,因此我无法更改架构或类似的东西。

我的代码中每个类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将为id2的customer2选取任何地址。我最初尝试修复是为该组添加多个键:

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

然而,当我这样做时,我得到以下异常:

org.hibernate.MappingException:外键必须与引用的主键具有相同数量的列)

有没有人有解决方案。有没有办法将descriminator映射到类作为某种虚拟复合键?或者我可以使用set映射将其限制为特定的customer表吗?

1 个答案:

答案 0 :(得分: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>