我将用一个人为的例子来说明我的问题,尽量让它尽可能简单易懂。然而,我真正的问题是在遗留代码中,因此我无法更改架构或类似的东西。
我的代码中每个类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表吗?
答案 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>