hibernate實體類之間的一對一關係(轉載)
- one-to-one 元素
屬性:
- name:對映類屬性的名字
- class:對映的目標類
- cascade:設定操作中的級聯策略 可選值為 all所有操作情況均進行級聯、none所有操作情況均不進行級聯、save-update執行更新操作時級聯、delete執行刪除操作時級聯
- constrained:表明當前類對應的表與被關聯的表之間是否存在著外來鍵約束 預設值為false
- fetch:設定抓取資料的策略 可選值為 join外連線抓取、select序列選擇抓取
- property-ref:設定關聯類的屬性名,此屬性和本類的主鍵相對應 預設值為關聯類的主鍵
- access:Hibernate訪問這個屬性的策略 預設值為property
- formula:絕大多數一對一關聯都指向其實體的主鍵。在某些情況下會指向一個或多個欄位或是一個表示式,此時可用一個SQL公式來表示
- lazy:指定是否採用延遲載入及載入策略 預設值為proxy通過代理進行關聯 可選值為 true此物件採用延遲載入並在變數第一次被訪問時抓取、false此關聯物件不採用延遲載入
- entity-name:被關聯類的實體名
單向1——1關聯:
需要在實體中提供setter、getter方法;
事實上單向的1——1和N——1配置非常相似;只需要在many-to-one元素增加 unique="true"屬性,用於表示N的一端必須是唯一的即可!(既然N的一端加了唯一性約束那麼就成了1——1了!)
A、基於外來鍵的單向1——1關聯:
將無 連線表的many-to-one元素增加 unique="true"屬性,即可完成對映!
eg:
<!-- 用於對映1-1關聯實體,指定關聯實體類為Address 指定外來鍵列名為addressId,並指定級聯全部操作 --> <many-to-one name="address" cascade="all" unique="true" class="Address" column="addressId"/>
B、有連線表的單向1——1關聯:
將連線表的many-to-one元素增加 unique="true"屬性,即可完成對映!
eg:
<!-- 對映連線表中參照關聯實體的外來鍵列 --> <many-to-one name="address" cascade="all" unique="true" class="Address" column="addressId"/>
C、基於主鍵的單向1——1關聯:
eg:
<class name="Person"> <!-- 對映標識屬性personid --> <id name="personid" column="addressid"> <!-- 基於主鍵關聯時,主鍵生成策略是foreign, 表明根據關聯類的主鍵來生成本表主鍵 --> <generator class="foreign"> <!-- 指定引用關聯實體的屬性名 --> <param name="property">address </param> </generator> </id> <!-- 用於對映普通屬性 --> <property name="name" type="string"/> <property name="age" type="int"/> <!-- 下面對映基於主鍵的1-1關聯 --> <one-to-one name="address "/> </class>
雙向1——1關聯:
需要在兩邊實體類中增加引用關聯實體的屬性:
A、 基於外來鍵的雙向1——1關聯:
基於外來鍵的1——1關聯,外來鍵可以存放在任意一端,
- 存放的一端要增加many-to-one元素,並新增unique=”true“,
- 另一端使用one-to-one元素,使用property-ref指定引用關聯類的屬性;
eg:
Preson.hbm.xml <!-- one-to-one元素對映關聯屬性,外來鍵列在對方的表內 person-ref指定引用關聯類的屬性。 即:在address屬性所屬的Address類內, 必須有person屬性的setter和getter方法 --> <one-to-one name="address" property-ref="person"/>
Address.hbm.xml
<!-- 使用many-to-one對映1-1關聯實體 unique="true"確定為1-1--> <many-to-one name="person" unique="true" column="person_id" not-null="true"/>
B、基於主鍵的雙向1——1關聯:
主鍵對映策略,一端的主鍵生成器必須使用foreign策略,表名根據對方的主鍵生成策略來生成自己的主鍵本實體不能擁有自己的主鍵生成策略;
eg: Preson.hbm.xml
<!-- one-to-one元素對映關聯屬性 --> <one-to-one name="address"/>
Address.hbm.xml
<!-- Address持久化類--> <class name="Address"> <!-- 對映標識屬性addressid --> <id name="addressid"> <!-- 指定foreign主鍵生成器策略--> <generator class="foreign"> <!-- 指定根據主鍵將根據person屬性引用的 關聯實體的主鍵來生成--> <param name="property">person</param> </generator> </id> <!-- 對映普通屬性addressdetail --> <property name="addressdetail"/> <!-- 用於對映關聯屬性 --> <one-to-one name="person"/> </class>
C、有連線表的雙向1——1關聯:
用的比較少,只給出例子:
eg:
Preson.hbm.xml
<!-- 使用join元素強制使用連線表 --> <join table="person_address" inverse="true"> <!-- 對映連線表中參照本實體主鍵的外來鍵列 --> <key column="person_id" unique="true"/> <!-- 對映1-1關聯實體 --> <many-to-one name="address" class="Address" unique="true" column="address_id"/> </join>
Address.hbm.xml
<!-- 使用join元素強制使用連線表 --> <join table="person_address" optional="true"> <!-- 對映連線表中參照本實體主鍵的外來鍵列 --> <key column="address_id" unique="true"/> <!-- 對映1-1關聯實體 --> <many-to-one name="person" class="Person" unique="true" column="person_id" /> </join>