淺析Hibernate映射(二)——關係映射(4)

單向一對多關聯映射html

映射後的關係模型:app

映射文件:spa

一對多關聯映射和多對一關聯映射映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端.net

 

它們的區別在於維護的關係不一樣:hibernate


 * 多對一維護的關係是:多指向一的關係,有了此關係,在加載多的時候能夠將一加載上來xml


 * 一對多維護的關係是:一指向多的關係,有了此關係,在加載一的時候能夠將多加載上來htm

Group.hbm.xmlblog

[html]  view plain copy print ?
 
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.jialin.hibernate">  
  6.   
  7.     <class name="Group" table="t_group">  
  8.         <id name="id">  
  9.             <generator class="native" />  
  10.         </id>  
  11.         <property name="name" />  
  12.       
  13.         <set name="users">  
  14.             <key column="groupid"/>  
  15.             <one-to-many class="User"/>  
  16.         </set>  
  17.     </class>  
  18.   
  19. </hibernate-mapping>  

User.hbm.xmlip

[html]  view plain copy print ?
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.jialin.hibernate">  
  6.     <class name="User" table="t_user">  
  7.         <id name="id">  
  8.             <generator class="native" />  
  9.         </id>  
  10.   
  11.         <property name="name" />  
  12.   
  13.     </class>  
  14.   
  15. </hibernate-mapping>  

在一的一端維護關係存在缺陷:get

* 由於多的一端User不知道Group的存在(也就是User沒有維護與Group的關係)
 因此在保存User的時候關係字段groupid是爲null的,若是將該關係字段設置爲非空,則
 將沒法保存數據

 * 另外由於User不維護關係,而Group維護關係,Group就會發出多餘的update語句,保證
 Group和User有關係,這樣加載Group的時候才能夠把該Group對應的User加載上來

爲了克服這些缺陷,咱們通常將單向一對多關聯映射改成雙向的。以下:

映射後的關係模型與單向的同樣:

採用一對多雙向關聯映射的目的主要是爲了主要是爲了解決一對多單向關聯的缺陷,而不是需求驅動的。

映射文件:

一對多雙向關聯的映射方式:
 * 在一的一端的集合上採用<key>標籤,在多的一端加入一個外鍵
 * 在多的一端採用<many-to-one>標籤
 * <key>標籤和<many-to-one>標籤加入的字段保持一直,不然會產生數據混亂

Group.hbm.xml

[html]  view plain copy print ?
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.jialin.hibernate">  
  6.   
  7.     <class name="Group" table="t_group">  
  8.         <id name="id">  
  9.             <generator class="native" />  
  10.         </id>  
  11.         <property name="name" />  
  12.       
  13.         <set name="users" inverse="true">  
  14.             <key column="groupid"/>  
  15.             <one-to-many class="User" />  
  16.         </set>  
  17.     </class>  
  18.   
  19. </hibernate-mapping>  

User.hbm.xml

[html]  view plain copy print ?
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.jialin.hibernate">  
  6.     <class name="User" table="t_user">  
  7.         <id name="id">  
  8.             <generator class="native" />  
  9.         </id>  
  10.           
  11.         <property name="name" />  
  12.         <many-to-one name="group" column="groupid"/>  
  13.     </class>  
  14.   
  15. </hibernate-mapping>  

inverse屬性:

 * inverse屬性能夠用在一對多和多對多雙向關聯上,inverse屬性默認爲false,爲 false表示本端能夠維護關係,若是inverse爲true,則本端不能維護關係,會交給另外一端 維護關係,本端失效。
 一對多關聯映射咱們一般在多的一端維護關係,讓一的一端失效,因此設置inverse爲true

*inverse是控制方向上的反轉,隻影響存儲

相關文章
相關標籤/搜索