【问题标题】:how to use composite-id class element?如何使用复合id类元素?
【发布时间】:2009-10-01 13:51:07
【问题描述】:

什么时候应该使用composite-id的class元素?

例如,考虑这个 sn-p :

<composite-id name="id" ***class="OrderLineId"***>
    <key-property name="lineId"/>
    <key-property name="orderId"/>
    <key-property name="customerId"/>
</composite-id>

<property name="name"/>

<many-to-one name="order" class="Order"
        insert="false" update="false">
    <column name="orderId"/>
    <column name="customerId"/>
 </many-to-one>
  ....

例如,上面的 OrderLineId 的目的是什么? 它与其他部分有什么关系?

【问题讨论】:

  • 你的问题。我不明白。

标签: java hibernate


【解决方案1】:

简短的回答是“你不应该”:-)

首先使用代理键通常是个好主意;此外,您可以通过使用单个 id 而不是复合 id 来简化映射。也就是说,在某些情况下(例如映射旧架构)需要使用复合键。

上面的例子展示了如何将复合键映射为组件。这是一种比使用实体本身作为自己的键更好的方法,如果您要在没有 &lt;composite-id&gt; 上的 class 属性的情况下映射它会发生这种情况。主要区别在于:

  1. 当将复合键映射为组件时,您将编写一个新类 (OrderLineId),其中包含映射的单个键部分 (lineIdorderIdcustomerId) 作为属性。在实体本身上映射复合键时,您的实体类 (OrderLine) 必须包含这些属性。
  2. 为了使用“作为组件的键”映射加载OrderLine,您将创建OrderLineId 的新实例并将其作为键传递给session.get()。使用“实体上的键”映射,您必须创建一个 OrderLine 的实例来加载 OrderLine,这充其量是令人困惑的,最坏的情况是会出现数据完整性问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2012-11-29
    • 1970-01-01
    • 2014-05-29
    • 2021-08-19
    • 2013-03-15
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多