什么时候应该使用composite-id的class元素?
例如,考虑这个片段:
<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的用途是什么? 它与其他部分有何关系?
最佳答案
简短的回答是“你不应该”:-)
首先使用代理键通常是个好主意;此外,通过使用单个 id 而不是复合 id,您可以使映射变得更加简单。也就是说,在某些情况下(例如映射旧模式)您需要使用组合键。
上面的示例展示了如何将复合键映射为组件。这是比使用实体本身作为自己的键更好的方法,如果您在没有 class
的情况下映射它,就会发生这种情况。属性 <composite-id>
。主要区别是:
- 将复合键映射为组件时,您将编写一个新类 (
OrderLineId
),其中包含映射的各个键部分 (lineId
、orderId
、customerId
) 作为属性。当在实体本身上映射复合键时,您的实体类(OrderLine
)必须包含这些属性。 - 为了加载
OrderLine
使用“键作为组件”映射,您将创建OrderLineId
的新实例并将其传递给session.get()
作为关键。使用“实体上的键”映射,您必须创建OrderLine
的实例加载OrderLine
,往好了说是令人困惑,往坏了说是会带来数据完整性问题。
关于java - 如何使用composite-id类元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1504088/