如何使用composite-id类元素?

时间:2009-10-01 13:51:07

标签: java hibernate

何时应该使用composite-id的元素?

例如,请考虑以下代码段:

<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的目的是什么? 它与其他部分有什么关系?

1 个答案:

答案 0 :(得分:1)

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

首先使用代理键通常是个好主意;此外,通过使用单个id而不是复合id,可以使映射更简单。也就是说,当您需要使用复合键时,有些情况(如映射旧模式)。

上面的示例显示了如何将组合键映射为组件。这是一种比将实体本身用作自己的密钥更好的方法,如果您在class上没有<composite-id>属性进行映射,就会发生这种情况。主要区别是:

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