1. 程式人生 > >many-to-one各屬性含義

many-to-one各屬性含義

通過many-to-one 元素,可以定義一種常見的與另一個持久化類的關聯。

這種關係模型是多對一關聯(實際上是一個物件引用-譯註):這個表的一個外來鍵引用目標表的 主鍵欄位。

<many-to-one

        name="propertyName"                                          (1)


        column="column_name"                                         (2)


        class="ClassName"                                            (3)
cascade="cascade_style" (4) fetch="join|select" (5) update="true|false" (6) insert="true|false" (6)
property-ref="propertyNameFromAssociatedClass" (7) access="field|property|ClassName" (8) unique="true|false" (9) not-null="true|false" (10)
optimistic-lock="true|false" (11) lazy="true|proxy|false" (12) not-found="ignore|exception" (13) entity-name="EntityName" (14) node="element-name|@attribute-name|element/@attribute|." embed-xml="true|false" />
(1) name : 屬性名。
(2) column   (可選): 外間欄位名。它也可以通過巢狀的  <column> 元素指定。
(3) class   (可選 - 預設是通過反射得到屬性型別): 關聯的類的名字。
(4) cascade(級聯)   (可選): 指明哪些操作會從父物件級聯到關聯的物件。
(5) fetch   (可選 - 預設為  select ): 在外連線抓取(outer-join fetching)和序列選擇抓取(sequential select fetching)兩者中選擇其一。
(6) update, insert   (可選 - defaults to  true ) 指定對應的欄位是否包含在用於UPDATE   和/或  INSERT   的SQL語句中。如果二者都是false ,則這是一個純粹的 “外源性(derived)”關聯,它的值是通過對映到同一個(或多個)欄位的某些其他屬性得到 或者通過trigger(觸發器)、或其他程式。
(7) property-ref : (可選) 指定關聯類的一個屬性,這個屬性將會和本外來鍵相對應。 如果沒有指定,會使用對方關聯類的主鍵。
(8) access   (可選 - 預設是  property ): Hibernate用來訪問屬性的策略。
(9) unique   (可選): 使用DDL為外來鍵欄位生成一個唯一約束。此外, 這也可以用作property-ref 的目標屬性。這使關聯同時具有 一對一的效果。
(10) not-null   (可選): 使用DDL為外來鍵欄位生成一個非空約束。
(11) optimistic-lock   (可選 - 預設為  true ): 指定這個屬性在做更新時是否需要獲得樂觀鎖定(optimistic lock)。 換句話說,它決定這個屬性發生髒資料時版本(version)的值是否增長。
(12) lazy   (可選 - 預設為  proxy ): 預設情況下,單點關聯是經過代理的。lazy="true" 指定此屬性應該在例項變數第一次被訪問時應該延遲抓取(fetche lazily)(需要執行時位元組碼的增強)。lazy="false" 指定此關聯總是被預先抓取。
(13) not-found   (可選 - 預設為  exception ): 指定外來鍵引用的資料不存在時如何處理:  ignore 會將資料不存在作為關聯到一個空物件(null)處理。
(14) entity-name   (optional): 被關聯的類的實體名。

cascade 屬性設定為除了none 以外任何有意義的值, 它將把特定的操作傳播到關聯物件中。這個值就代表著Hibernate基本操作的名稱,  persist, merge, delete, save-update, evict, replicate, lock, refresh , 以及特別的值delete-orphan 和all ,並且可以用逗號分隔符 來合併這些操作,例如,cascade="persist,merge,evict" 或  cascade="all,delete-orphan" 。

一個典型的簡單many-to-one 定義例子:

<many-to-one name="product" class="Product" column="PRODUCT_ID"/>

property-ref 屬性只應該用來對付老舊的資料庫系統, 可能有外來鍵指向對方關聯表的是個非主鍵欄位(但是應該是一個惟一關鍵字)的情況下。 這是一種十分醜陋的關係模型。比如說,假設Product 類有一個惟一的序列號, 它並不是主鍵。(unique 屬性控制Hibernate通過SchemaExport工具生成DDL的過程。)

<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>

那麼關於OrderItem   的對映可能是:

<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>

當然,我們決不鼓勵這種用法。

如果被引用的唯一主鍵由關聯實體的多個屬性組成,你應該在名稱為<properties> 的元素 裡面對映所有關聯的屬性。