java - 如何使用composite-id类元素?

标签 java hibernate

什么时候应该使用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> 。主要区别是:

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

关于java - 如何使用composite-id类元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1504088/

相关文章:

java - 运行在 Jenkins 下运行 JVM 的批处理文件时的堆大小

java - 捕获Akka/Java中路径的所有段

java - Spring 启动: What is causing this TransientDataAccessResourceException?

java - Hibernate - 从注释到 XML 配置文件

java - Hibernate 示例未找到任何实例

java - 无法将图片上传到亚马逊服务

java - 如何在 Tesseract (Java) 中使用用户词?

hibernate 无法获取下一个序列值

java - 信息 : No Spring WebApplicationInitializer types detected on classpath (jre 1. 8)

java - Hibernate 给出 'table is not mapped' 异常