many-to-one各屬性含義
阿新 • • 發佈:2019-02-19
通過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> 的元素 裡面對映所有關聯的屬性。