Hibernate映射解析——關聯映射(二)

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   color   os   sp   for   

在前一篇文章,我們說了多對一和一對多映射原理是一樣的,都是在多的一端加入一個外鍵指向一的一端。
區別在於維護的關係不同。

  • 多對一維護的關係:多指向一的關係,如果維護了多指向一的關係,那麼載入多的時候會把一載入上來
  • 一對多維護的關係:一指向多的關係,如果維護了一指向多的關係,那麼載入一的時候會把多載入上來

一對多映射包含兩種映射方式:

1.單向一對多
物件模型圖表:




關聯式模式圖:



Classes.hbm.xml設定檔

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.blackfox.hibernate.Classes" table="t_classes"><id name="id"><generator class="native"/></id><property name="name"/><!-- 設定在多的一端加入一個外鍵 --><set name="students"> <key column="classesid"/><one-to-many class="com.blackfox.hibernate.Student"/></set></class></hibernate-mapping>

Student.hbm.xml設定檔

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.bjpowernode.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/></class></hibernate-mapping>


為什麼不讓一的一端來維護關係呢?

  • 多的一端Student不知道Classes的存在,(也就是Student沒有維護與Classes的關係) 所以在儲存Student的時候關係欄位classesid是為null,如果將該欄位設定為非空,則將無法儲存資料。


  • Student不維護關係,而Classes維護關係,Classes就會發出多餘的update語句,保證class 和 Student有關係,這樣載入classes的時候才可以把該Classes對應的學生載入上來。

為瞭解決這種弊端,Hibernate提供了第二種映射方式,即雙向一對多映射。

2.雙向一對多

物件模型圖表


關聯式模式圖

   


一對多雙向關聯的映射方式:
  •    在一的一端的集合上採用<key>標籤,在多的一端加入一個外鍵
  •  在多的一端採用<many-to-one>標籤

!!!注意:<key>標籤和<many-to-one>標籤加入的欄位保持一致,否則會產生資料混亂

 
Classes.hbm.xml設定檔

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.blackfox.hibernate.Classes" table="t_classes"><id name="id"><generator class="native"/></id><property name="name"/><set name="students" inverse="true"> <key column="classesid"/><one-to-many class="com.blackfox.hibernate.Student"/></set></class></hibernate-mapping>


Student.hbm.xml設定檔

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.blackfox.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/> <!--Student也維護了關係  --><many-to-one name="classes" column="classesid"/>  </class></hibernate-mapping>

!!!注意:採用一對多雙向關聯的目的主要是解決一對多單向關聯的缺陷而不是需求驅動的。



Hibernate映射解析——關聯映射(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.