天天看點

Hibernate建立多對一的單向關聯關系

以下内容整理自《精通Hibernate》第二版

映射代碼:

<span style="font-size:18px;"><many-to-one
        name="customer"
        column="CUSTOMER_ID"
        class="mypack.Customer"
        not-null="true"
        lazy="false"
/></span>
           

<many-to-one>元素建立了customer屬性和ORDERS表的外鍵CUSTOMER_ID之間的映射。它包括以下屬性。   name:設定待映射的持久化類的屬性的名字,此處為Order類的customer屬性。

column:設定和持久化類的屬性對應的表的外鍵,此處為ORDERS表的外鍵CUSTOMER_ID。 class:設定待映射的持久化類的屬性的類型,此處設定customer屬性為Customer類型。 not-null:如果為true,表示customer屬性不允許為null,該屬性的預設值為false。not-null屬性會影響hbm2ddl工具生成的資料庫schema,hbm2ddl工具會為ORDERS表的CUSTOMER_ID外鍵設定not null限制,但not-null屬性不會影響hbm2java工具生成Java源代碼。此外,not-null屬性還會影響Hibernate的運作時行為,Hibernate在向資料庫中儲存Order對象時,會先檢查它的customer屬性是否為null。 lazy:如果為proxy,表示對關聯的Customer對象使用延遲檢索政策并且使用代理,這是預設值。如果為false,就意味着當Hibernate從資料庫中加載Order對象時,還會立即自動加載與它關聯的Customer對象

注:當Hibernate持久化一個臨時對象(指剛通過new語句建立),在預設情況下,它不會自動持久化所關聯的其他臨時對象,是以會抛出TransientObjectException異常。如果希望當Hibernate持久化一個臨時對象時自動持久化所關聯的臨時對象,可以把<many-to-one>的cascade屬性設為"save-update",cascade屬性的預設值為"none"。 當cascade屬性為"save-update",表明儲存或更新目前對象時(即執行insert或update語句時),會級聯儲存或更新與它關聯的對象。

繼續閱讀