hibernate中基於主鍵映射1-1關聯關係和基於外鍵映射1-1關聯關係的不同

來源:互聯網
上載者:User

標籤: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關聯關係的不同

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.