標籤: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映射解析——關聯映射(二)