我将通过一个人为的示例来说明我的问题,以尽量使其简单易懂。但是我真正的问题是遗留代码,所以我不能更改架构或类似的东西。
我的代码中每个班级都有一个表格。假设 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:外键必须与引用的主键具有相同的列数)
有没有人对此有解决方案。有没有办法将描述符映射到类作为某种虚拟复合键?或者我可以用集合映射做些什么来将它限制在特定的客户表中?