2011-10-18 52 views
0

我正在努力將他的地址保存在一起。我有人與地址之間的一對一映射。人員類有地址實例。當我創建人表地址表也創建。直到這裏沒有問題。但是,當我試圖挽救人,地址沒有得到saved.Here是我的映射文件保存一對一的關聯在休眠?

<hibernate-mapping> 

    <class name="com.daasl.Person" table="person"> 
    <id name="id" type="int"> 
    <generator class="increment"/> 
    </id> 

    <property name="name" column="cname" type="string"/> 
    <one-to-one name="address" class="com.daasl.Address"/> 
    </class> 


<class name="com.daasl.Address" table="Address"> 
    <id name="id" type="int"> 
    <generator class="increment"/> 
    </id> 
    <property name="personId" type="int"/> 
    <property name="addressLine1" type="string"/> 

</class> 

</hibernate-mapping> 

我不知道怎麼會在這裏建立外鍵關係(基本上,我想在地址表的人id作爲外鍵的人表),當我將數據保存到人表時,地址也應該被保存,而現在不會發生。類似地,我檢索數據,我也應該得到地址數據。

+1

向我們顯示您的代碼。但可以肯定的是,你不應該在地址中有personId(int)字段,而是一個person(或Person類型)字段。這將是相反的一對一關聯。閱讀http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#assoc-bidirectional-join-121 –

回答

3

您的一對一關係似乎好的。如果在保存關聯人員時未保存地址,可能是因爲您尚未配置cascading

默認情況下,Hibernate不會執行任何級聯,因此只有人員將被保存,而不是關聯的實體。你應該這樣做:

<one-to-one name="address" class="com.daasl.Address" cascade="save-update"/> 

在你的Person-> Address關係中。

級聯的類型取決於您在Person實體上執行的操作(保存,更新等)。根據以上鍊接,與此類操作相關的不同類型的級聯 - 使用適合您需要的級聯。

+0

謝謝貢薩洛。數據現在也被保存在地址表中。但是我現在面臨的兩個問題是1)數據進入地址表,但地址表中的personid是人員表中的personid的外鍵。不確定如何在上面的hbm文件中定義外鍵關係。2)當我檢索到人人p1 =(人)會話。得到(Person.class,1); IAM期待代理。我的意思是當我做p1.getName時,應該加載實際的數據。即使地址關聯也被急切地加載(默認情況下hibernate支持延遲加載)。不知道爲什麼它會像這樣發生? –

+0

「1)數據進入地址表,但地址表中的personid是人員表中的personid的關鍵字。不確定如何定義上述hbm文件中的外鍵關係」 不確定你想在這裏定義什麼。你能再詳細一點嗎?儘管如此,我仍然將外鍵列定義爲實體中的字段。如果你想要引用地址中的人物,我也將地址中的關係的反面定義爲OneToOne。另外,你可以顯示實體嗎?最後,沒有使用註釋而不是XML的具體原因是什麼? –

+0

貢薩洛沒有使用註釋的具體原因。我是休眠的新手。所以儘管XML會更好地幫助我理解基礎知識。我是否需要做一些配置來啓用註釋,或者我可以直接開始使用它? –