(五)Hibernate之集合屬性映射

Hibernate的集合屬性映射簡稱集合映射

集合屬性大致有兩種:

第一種是單純的集合屬性,如像 List、Set 或數組等集合屬性;

另一種是Map結構的集合屬性,每個屬性值都有對應的Key映射。 

  集合映射的元素大致有如下幾種:

  • List: 用於映射 List 集合屬性
  • Set: 用於映射 Set 集合屬性
  • Map: 用於映射 Map 集合性
  • Array: 用於映射數組集合屬性
  • Bag: 用於映射無序集合【包括Collection和List】
  • idbag: 用於映射無序集合,但爲集合增加邏輯次序
1.Set 集合屬性
Set 集合屬性映射與 
List 非常相似,但因爲 Set 是無序的,不可重複的集合。因此 set 元素無須使用 index 元素來指定集合元素次序。
映射文件與 
List 相似,區別在於使用 set 元素時,無須增加 index 列來保存集合的次序。如下映射文件:
Student.java
Java代碼  收藏代碼
  1. <span style="font-size: large;">package com.javacrazyer.domain;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. /** 
  7.  * 學生實體類 --> 按JavaBean的形式定義 
  8.  *  
  9.  */  
  10. public class Student {  
  11.     private int id;  //OID 對象標識符  
  12.     private String name;  
  13.     //值類型的Set集合屬性  
  14.     //值類型:沒有OID的類  
  15.     //Hiberante框架要求集合屬性必須定義成接口類型,在真正運行時Hibenrate會根據要求把實現類替換掉  
  16.     private Set<String> hobbies = new HashSet<String>();  
  17.       
  18.     public int getId() {  
  19.         return id;  
  20.     }  
  21.   
  22.     public void setId(int id) {  
  23.         this.id = id;  
  24.     }  
  25.   
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.   
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33.   
  34.     public Set<String> getHobbies() {  
  35.         return hobbies;  
  36.     }  
  37.   
  38.     public void setHobbies(Set<String> hobbies) {  
  39.         this.hobbies = hobbies;  
  40.     }  
  41.   
  42.     @Override  
  43.     public String toString(){  
  44.         return "id=" + id + ",name=" + name;  
  45.     }  
  46.       
  47.       
  48.       
  49. }  
  50. </span>  
 對應的映射文件Student.hbm.xml
Xml代碼  收藏代碼
  1. <span style="font-size: large;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7.     <class name="com.javacrazyer.domain.Student" table="student">  
  8.         <id name="id" column="id">  
  9.             <generator class="native"/>  
  10.         </id>  
  11.         <property name="name" column="name"/>  
  12.         <!--這樣就可以生成了兩個表了,一個是上邊的student,一個是stu_hobby-->  
  13.         <set name="hobbies" table="stu_hobby" order-by="hobby_name desc">  
  14.             <!--外鍵,命名是stu_id,引用自student表的主鍵-->  
  15.             <key column="stu_id"/>  
  16.             <element column="hobby_name" type="string"/>  
  17.         </set>  
  18.     </class>  
  19. </hibernate-mapping></span>  
 2.List 集合屬性
【將studetn.java的集合屬性換成:private List<String> hobbies = new ArrayList<String>();】

List是有序集合,因此持久化到數據庫時也必須增加一列來表示集合元素的次序。看持久化類,該Student.java類有個集合屬性:hobbies ,該屬性對應愛好。而集合屬性只能以接口聲明,因此代碼中,hobbies  的類型能是List ,不能是ArrayList ,但該集合屬性必須使用實現類完成初始化。【無論是種類型的集合屬性都要遵守這個規定】

在作相應映射時,list元素要求用list-index的子元素來映射有序集合的次序列。集合的屬性的值會存放有另外的表中,不可能與持久化類存儲在同一個表內。因此須以外鍵關聯,用Key元素來映射該外鍵列。

 

Java代碼  收藏代碼
  1. <span style="font-size: large;"><list name="hobbies" table="stu_hob3">  
  2.     <key column="stu_id"/>  
  3.     <list-index column="posistion"/>  
  4.     <element column="hobby_name" type="string"/>  
  5. </list></span>  

  3. bag 元素映射

【將student.java換成對應的List的或者Coollection的,比如:private Collection<String> hobbies = new ArrayList<String>();】

 

bag 元素既可以爲 List 集合屬性映射,也可以爲 Collection 集合屬性映射。不管是哪種集合屬性,使用 bag 元素都將被映射成無序集合,而集合屬性對應的表沒有

Java代碼  收藏代碼
  1. <span style="font-size: large;"><bag name="hobbies" table="stu_hob2">  
  2.     <key column="stu_id"/>  
  3.     <element column="hobby_name" type="string"/>  
  4. </bag></span>  
 4. Map 集合屬性
【將student.java中的集合屬性換成private Map<String, String> hobbies = new HashMap<String,String>();】

Map 不公需要映射屬性值,還需要映射屬性 Key 。映射 Map 集合屬性時,同樣需要指定外鍵列,同時還必須指定 Map 的 Key 列。顯然,系統將以外鍵列和 Key 列作爲聯合主鍵。
與所有集合屬性類似,屬性聲明只能使用接口

Map 集合屬性使用 map 元素映射時,該 map 元素需要 key 和 map-key 兩個子元素。其中 key 子元素用於映射外鍵列,而 map-key 子元素則用於映射 Map 集合的 Key 。映射文件如下:
Java代碼  收藏代碼
  1. <span style="font-size: large;"><map name="hobbies" table="stu_hob5">  
  2.     <key column="stu_id"/>  
  3.     <map-key column="hob_id" type="string"/>  
  4.     <element type="string" column="hob_name"/>  
  5. </map></span>  
 注意:map-key 和 element 元素都必須確定type屬性 

5. 集合性能的分析
對於集合屬性,通常推薦使用延遲加載策略。所謂延遲加載就是當系統需要使用集合屬性時才從數據庫裝載關聯的數據。
 Hibernate對集合屬性默認採用延遲加載,在某些特殊的情況下爲 set,,list,map 等元素設置lazy="false" 屬性來取消延遲加載。
可將集合分成如下兩類:

  • 有序集合:集合裏的元素 可以根據 Key 或 Index 訪問
  • 無序集合:集合裏的元素中能遍歷

有序集合的屬性有增加、刪除及修改中擁有較好的性能表現。在設計較好的 Hiberate domain Object 中,集合屬性通常都會增加inverse="true" 的屬性,此時集合端不再控制關聯關係。映射 Set 集合屬性時,如果 element 元素包括 not-null="true" 屬性,則集合屬性表以關聯持久化類的外鍵和元素列作爲聯合主鍵,否則該表沒有主鍵,但 List 集合屬性的表總是以外鍵和元素次序列作爲聯合主鍵。


發佈了7 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章