【问题标题】:Mapping a set in Hibernate with a composite primary key在 Hibernate 中使用复合主键映射集合
【发布时间】:2013-05-01 13:07:18
【问题描述】:

出于与数据库复制相关的原因,我需要我的数据库中的所有表都有主键。

我的应用程序中的一些实体定义如下:

<class name="Item" table="ITEM">  

    <id name="id" column="ITEM_ID"/>
    <property name="name" column="NAME" />  

    <set name="images" table="ITEM_IMAGE">
        <key column="ITEM_ID"/>
        <element type="string" column="FILENAME" not-null="true"/>
    </set>  

</class>

根据Java Persistence with Hibernate 一书(2006 年 11 月)。第 6 章,第 244 页

"一个集合不能包含重复的元素,所以该集合的主键 ITEM_IMAGE 集合表是 声明:ITEM_ID 和 FILENAME。”

问题是,这种映射集合的方式实际上创建了一个没有主键的集合表。 (只是父实体表的外键)

有没有办法使用键元素集映射并强制休眠以两列的复合主键创建集合表? (我对将集合映射更改为键/多对多不感兴趣,这将创建另一个子实体表)有人可以解释这种行为吗?

谢谢!

A related question

【问题讨论】:

    标签: java hibernate collections


    【解决方案1】:

    根据Hibernate 4.2 documentation 20.6.1

    如果您希望 SchemaExport 实际创建 的主键,则必须将所有列声明为 not-null="true"。

    因此,在您的示例中,您只是缺少 key 元素上的 not-null

    <class name="Item" table="ITEM">  
    
        <id name="id" column="ITEM_ID"/>
        <property name="name" column="NAME" />  
    
        <set name="images" table="ITEM_IMAGE">
            <key column="ITEM_ID" not-null="true"/>
            <element type="string" column="FILENAME" not-null="true"/>
        </set>  
    
    </class>
    

    如果无法将所有列定义为非空,您可以通过 &lt;database-object&gt; 元素显式向表添加索引(请参阅 Hibernate 文档关于 Auxiliary database objects)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多