標籤:app ppi 關聯 ring rtm qup 區別 manager bsp
基於主鍵映射1-1關聯關係和基於外鍵映射1-1關聯關係的不同,主要區別是在配置對應檔上會有區別
兩個持久化類為Manager和Department
1:基於主鍵映射1-1關聯關係
1)使用其他持久化類的主鍵產生主鍵的實體的對應檔 首先需要指定主鍵產生方式為foreigner
格式為:
<id name="departmentId" type="java.lang.Integer">
<column name="department_id"/>
<!--使用外鍵的方式來產生當前的主鍵-->
<generator class="foreign">
<param name="property">manager</param>
</generator>
裡面有一個param元素,property屬性指定使用當前持久化類的哪一個屬性的主鍵作為外鍵
2)使用one-to-one元素映射關聯屬性且必須添加constrained="true"使當前的主鍵添加外鍵約束
完整的對應檔代碼如下
Department.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.cqupt.dayday"> <class name="Department" table="department" > <id name="departmentId" type="java.lang.Integer"> <column name="department_id"/> <!--使用外鍵的方式來產生當前的主鍵--> <generator class="foreign"> <!--property屬性指定使用當前持久化類的哪一個屬性的主鍵作為外鍵--> <param name="property">manager</param> </generator> </id> <property name="departmentName" type="java.lang.String"> <column name="department_name"/> </property> <!-- 採用foreigner主鍵產生器策略的一端增加one-to-one元素映射關聯屬性, 其one-to-one屬性還應增加constrained="true",以使當前的主鍵上添加外鍵約束 另一端增加 --> <one-to-one name="manager" class="Manager" constrained="true"></one-to-one> </class></hibernate-mapping>
Manager.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.cqupt.dayday"> <class name="Manager" table="manager" > <id name="managerId" type="java.lang.Integer"> <column name="manager_id"/> <!--指定主鍵的產生方式, native:使用資料庫本地方式--> <generator class="native"/> </id> <property name="managerName" type="java.lang.String"> <column name="manager_name"/> </property> <!--映射1-1的關聯關係:在對應的資料表中已經有外鍵了,當前持久化類使用one-to-one進行映射--> <one-to-one name="department" class="Department"></one-to-one> </class></hibernate-mapping>
2:基於外鍵映射1-1關聯關係的不同
1)使用外鍵的實體類對應檔中使用many-to-one來映射1-1關聯關係,且必須指定unique="true"
即一個部門只有一個經理,一個經理只有一個部門,每個部門對應的經理都是不一樣的
<many-to-one name="manager" class="Manager" column="manager_id" unique="true"></many-to-one>
2)沒有外鍵的實體類使用one-to-one映射1-1關聯關係,必須指定property-ref="被關聯實體類的引用"來指定使用被關聯實體主鍵以外的欄位作為關聯欄位
<one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
完整的設定檔如下
Department.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.cqupt.dayday"> <class name="Department" table="department" > <id name="departmentId" type="java.lang.Integer"> <column name="department_id"/> <!--指定主鍵的產生方式, native:使用資料庫本地方式--> <generator class="native"/> </id> <property name="departmentName" type="java.lang.String"> <column name="department_name"/> </property> <!--使用many-to-one的方式來映射1-1關聯關係--> <many-to-one name="manager" class="Manager" column="manager_id" unique="true"></many-to-one> </class></hibernate-mapping>
Manager.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.cqupt.dayday"> <class name="Manager" table="manager" > <id name="managerId" type="java.lang.Integer"> <column name="manager_id"/> <!--指定主鍵的產生方式, native:使用資料庫本地方式--> <generator class="native"/> </id> <property name="managerName" type="java.lang.String"> <column name="manager_name"/> </property> <!--映射1-1的關聯關係:在對應的資料表中已經有外鍵了,當前持久化類使用one-to-one進行映射--> <!--沒有外鍵的一端要使用one-to-one元素,該元素使用property-ref屬性來指定使用被關聯實體主鍵以外的欄位作為關聯欄位--> <one-to-one name="department" class="Department" property-ref="manager"></one-to-one> </class></hibernate-mapping>
hibernate中基於主鍵映射1-1關聯關係和基於外鍵映射1-1關聯關係的不同