【问题标题】:Hibernate Table Per Class & Set Mapping每个类和集合映射的休眠表
【发布时间】:2012-09-25 15:27:52
【问题描述】:

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

我的代码中每个类层次结构都有一个表。假设 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: 外键必须与引用的主键具有相同的列数)

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

【问题讨论】:

    标签: hibernate mapping set table-per-class


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2013-02-09
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多