2009-09-14 53 views
6

是否可以配置Hibernate以將組件類存儲在單獨的表中?將休眠組件映射到單獨的表

看看下面的例子:

<class name="test.ClassA"> 
    <property name="propA"/> 
    <component name="componentProp" class="test.ClassB"> 
     <property name="propB"/> 
    </component> 
</class> 

這映射到表有兩列propApropB稱爲MyClass。我想要的是將組件的屬性映射到名爲ClassB的表。

要做的就是配置ClassB本身作爲一個實體(它有ClassA外沒有意義的身份),這樣排除了正常的關聯。另外,我無法修改對象模型(它是生成的代碼),因此我無法將ID屬性引入ClassB

這似乎是Hibernate功能上的一個缺陷 - <組件映射執行「多個類到一個表」,並且聯接>執行「一個類到多個表」,但是奇怪的是,沒有采取實體關聯的方式,沒有明顯的方式來實現「多個類到多個表」。

我想要這樣做的基本原理是,我希望我的數據庫模式儘可能接近地類似於對象模型,並且包含ClassB組件的單獨表格。我知道這不會擴展 - 例如,你不能嵌套組件,但在這種特殊情況下這不是問題。

回答

6

可以使用<join><component>在一起,還是我誤解了你的問題?

<class name="test.ClassA"> 
    <property name="propA"/> 

    <join table="ClassB"> 
    <key column="ClassA_id" /> 
    <component name="componentProp" class="test.ClassB"> 
     <property name="propB"/> 
    </component> 
    </join> 

</class> 

雖然你(顯然)確實需要一個外鍵,但它不必映射到對象模型中。在詳細加盟商here - 提供完整而已,我知道你知道從哪裏:-)讓他們

文檔在上面的鏈接並沒有明確說的內連接組件映射任何東西,但DTD確實允許它我已經在3.1中工作了,所以我很確定它仍然可以正常工作。不過,不知道如何(或者是否有可能)將這個映射到註釋中。

+0

啊,那看起來就是我所需要的,謝謝。我會帶她出去看看是否是票。 – skaffman 2009-09-14 17:13:28

+0

我發現這項技術記載在「Java持久性與休眠」第8.1.3節中。聽起來很健康。再次感謝。 – skaffman 2009-09-21 16:35:04

+0

謝謝。我以某種方式設法從來沒有讀過這本書:-) – ChssPly76 2009-09-21 16:44:56