hibernate 集合映射(轉載)
2009-04-28 15:08:18| 分類: hibernate | 標籤: |字號大中小 訂閱
集合屬性大致有兩種:第一種是單純的集合屬性,如像 List、Set 或數組等集合屬性;另一種是Map結構的集合屬性,每個屬性值都有對應的Key映射。
集合映射的元素大致有如下幾種:
- List: 用於映射 List 集合屬性
- Set: 用於映射 Set 集合屬性
- Map: 用於映射 Map 集合性
- Array: 用於映射數組集合屬性
- Bag: 用於映射無序集合
- idbag: 用於映射無序集合,但爲集合增加邏輯次序
1. List 集合屬性
List是有序集合,因此持久化到數據庫時也必須增加一列來表示集合元素的次序。看下面的持久化類,該
News 類有個集合屬性:schools ,該屬性對應學校。而集合屬性只能以接口聲明,因此下面代碼中,schools 的類型能是List ,不能是ArrayList
,但該集合屬性必須使用實現類完成初始化。
- package cn.janwer;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.List;
- public class News implements Serializable {
- int id;
- String title;
- String content;
- private List schools = new ArrayList();
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this .content = content;
- }
- public int getId() {
- return id;
- }
- public void setId( int id) {
- this .id = id;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this .title = title;
- }
- public List getSchools() {
- return schools;
- }
- public void setSchools(List schools) {
- this .schools = schools;
- }
- }
在作相應映射時,list元素要求用list-index的子元素來映射有序集合的次序列。集合的屬性的值會存放有另外的表中,不可能與持久化類存儲在同一個表內。因此須以外鍵關聯,用Key元素來映射該外鍵列。
下面是該持久化類的映射文件:
- <xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping >
- <class name="cn.janwer.News" table="news">
- <id name="id" column="pid">
- <generator class="identity"/>
- </id>
- <property name="title" length="50" column="TITLE"/>
- <property name="content" length="50" column="CONTENT"/>
- <list name="schools" table="school">
- <key column="pid" not-null="true"/>
- <list-index column="list_order" />
- <element type="string" column="school_name"/>
- </list>
- </class>
- </hibernate-mapping>
2. Set
集合屬性
Set 集合屬性映射與 List 非常相似,但因爲
Set 是無序的,不可重複的集合。因此 set 元素無須使用
index 元素來指定集合元素次序。
映射文件與 List 相似,區別在於使用
set 元素時,無須增加 index 列來保存集合的次序。如下映射文件:
- <set name="schools" table="school">
- <key column="pid" not-null="true"/>
- <element type="string" column="school_name" not-null="true"/>
- </set>
3. bag 元素映射
bag 元素既可以爲
List 集合屬性映射,也可以爲 Collection 集合屬性映射。不管是哪種集合屬性,使用
bag 元素都將被映射成無序集合,而集合屬性對應的表沒有
- <bag name="school" table="schools" >
- <key column="pid" not-null="true" />
- <element ype="string" column="school_name"/>
- </bag>
4. Map 集合屬性
Map 不公需要映射屬性值,還需要映射屬性
Key 。映射 Map 集合屬性時,同樣需要指定外鍵列,同時還必須指定
Map 的
Key 列。顯然,系統將以外鍵列和 Key 列作爲聯合主鍵。
與所有集合屬性類似,屬性聲明只能使用接口,看下面的 POJO 類:
- private Map school=new HashMap();
- public Map getSchool() {
- return school;
- }
- public void setSchool(Map school) {
- this.school=school;
- }
Map 集合屬性使用 map 元素映射時,該 map 元素需要 key 和 map-key 兩個子元素。其中 key 子元素用於映射外鍵列,而 map-key 子元素則用於映射 Map 集合的 Key 。映射文件如下:
- <map name="school" table="schools">
- <key column="pid" not-null="true" />
- <map-key type="string" column="indet"/>
- <element type="float" column="score"/>
- </map>
注意:map-key 和
element 元素都必須確定type屬性
5. 集合性能的分析
對於集合屬性,通常推薦使用延遲加載策略。所謂延遲加載就是當系統需要使用集合屬性時才從數據庫裝載關聯的數據。
Hibernate對集合屬性默認採用延遲加載,在某些特殊的情況下爲
set,,list,map 等元素設置lazy="false" 屬性來取消延遲加載。
可將集合分成如下兩類:
- 有序集合:集合裏的元素 可以根據 Key 或 Index 訪問
- 無序集合:集合裏的元素中能遍歷
有序集合的屬性有增加、刪除及修改中擁有較好的性能表現。在設計較好的 Hiberate domain Object 中,集合屬性通常都會增加inverse="true" 的屬性,此時集合端不再控制關聯關係。映射 Set 集合屬性時,如果 element 元素包括 not-null="true" 屬性,則集合屬性表以關聯持久化類的外鍵和元素列作爲聯合主鍵,否則該表沒有主鍵,但 List 集合屬性的表總是以外鍵和元素次序列作爲聯合主鍵。