2013-05-01 122 views
1

由於與數據庫複製相關的原因,我需要數據庫中的所有表都具有主鍵。使用複合主鍵映射Hibernate中的集合

一些在我的應用程序中的實體的定義類似以下:

<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持久性與Hibernate(2006年11月)。第6章,第244頁

「A集不能包含重複的元素,所以 ITEM_IMAGE集合表的主鍵是在 聲明兩列的複合:ITEM_ID和FILENAME」

問題是,這種映射集的方式實際上會創建一個沒有主鍵的集合表。 (只有父實體表的外鍵)

有沒有辦法使用鍵元素集映射和強制hibernate創建具有兩列組合主鍵的集合表? (我不想改變設置映射到鍵/多對多,這將創建另一個子實體表)有人可以解釋這種行爲?

謝謝!

A related question

回答

2

根據Hibernate 4.2 documentation 20.6.1

如果你希望SchemaExport實際創建一個<設置>的主鍵,你必須申報所有列不空=「真」。

所以,在你的榜樣,你只有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> 

如果它不是可以定義所有列不空,你可以通過<database-object>元素明確地向該表添加索引(參見Hibernate關於Auxiliary database objects的文檔)。