使用复合主键映射Hibernate中的集合

时间:2013-05-01 13:07:19

标签: java hibernate collections

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

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

<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。“

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

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

谢谢!

A related question

1 个答案:

答案 0 :(得分:2)

根据Hibernate 4.2 documentation 20.6.1

  

如果希望SchemaExport实际创建&lt; set&gt;的主键,则必须将所有列声明为not-null =“true”。

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

<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>

如果无法将所有列定义为非null,则可以通过<database-object>元素向表中显式添加索引(请参阅有关Auxiliary database objects的Hibernate文档)。