0

我将通过一个人为的示例来说明我的问题,以尽量使其简单易懂。但是我真正的问题是遗留代码,所以我不能更改架构或类似的东西。

我的代码中每个班级都有一个表格。假设 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 会为 id 2 的 customer2 获取任何地址。我最初的修复尝试是向集合中添加多个键:

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

但是,这样做时,我得到以下异常:

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

有没有人对此有解决方案。有没有办法将描述符映射到类作为某种虚拟复合键?或者我可以用集合映射做些什么来将它限制在特定的客户表中?

4

1 回答 1

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>
于 2012-10-04T15:04:17.927 回答