`

Hibernate的集合映射(List、Set、Map、Array、Bag、idbag)

阅读更多
        集合属性大致有两种:第一种是单纯的集合属性,如像 List、Set 或数组等集合属性;另一种是Map结构的集合属性,每个属性值都有对应的Key映射。

         集合映射的元素大致有如下几种:

         List: 用于映射 List 集合属性
         Set: 用于映射 Set 集合属性
         Map: 用于映射 Map 集合性
         Array: 用于映射数组集合属性
         Bag: 用于映射无序集合
         idbag: 用于映射无序集合,但为集合增加逻辑次序


         1. List 集合属性
         List是有序集合,因此持久化到数据库时也必须增加一列来表示集合元素的次序。看下面的持久化类,该 News 类有个集合属性:schools ,该属性对应学校。而集合属性只能以接口声明,因此下面代码中,schools 的类型能是List ,不能是ArrayList ,但该集合属性必须使用实现类完成初始化。





Java代码
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代码
" quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" style="line-height: 19px; ">
<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 列来保存集合的次序。如下映射文件:

            Xml代码
" quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" style="line-height: 19px; ">
<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 元素都将被映射成无序集合,而集合属性对应的表没有

            Xml代码
" quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" style="line-height: 19px; ">
<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 类:

Java代码
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 。映射文件如下:

            Xml代码
" quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" style="line-height: 19px; ">
<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 集合属性的表总是以外键和元素次序列作为联合主键。

分享到:
评论

相关推荐

    Hibernate常见集合映射(Set,List_Array,Map,Bag)

    常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的集合类型,元素数据一般使用外键同主表关联。Set 集合非常适用于集合元素不...

    hibernate map 集合映射

    在Hibernate的映射文件(.hbm.xml)中,我们通常使用`&lt;set&gt;`, `&lt;list&gt;`, `&lt;map&gt;`等标签来定义集合映射。每个标签都有对应的属性,例如: - `name`: 对象属性名。 - `table`: 所映射的数据库表名。 - `inverse`: ...

    [原]Hibernate集合映射

    Hibernate支持多种集合映射类型,包括List、Set、Map、Bag、Array等。它们之间的区别主要在于元素的唯一性、顺序性和映射到数据库的实现方式。例如,List和Array维护元素的插入顺序,而Set不允许重复元素;Map则...

    JAVA培训-HIBERNATE的集合映射.doc

    在给定的文档“JAVA培训-HIBERNATE的集合映射.doc”中,主要讲解了Hibernate如何处理不同类型的集合映射,包括Set、List、Array、Map和Bag。我们将详细讨论这些集合映射以及它们在实际应用中的使用。 首先,我们来...

    hibernate中的集合映射范例程序

    在Java中,常见的集合类型有List、Set、Map等,它们在Hibernate中都有对应的映射方式。 1. **List映射**:List是最基础的集合类型,它允许元素重复并保持插入顺序。在Hibernate中,我们可以使用`&lt;list&gt;`标签来映射...

    hibernate源码分析过程

    集合映射可以是 set、list、map、bag、array 等。级联策略控制可以控制集合元素的保存和删除。排序策略可以控制集合元素的顺序。 聚合映射 Hibernate 的聚合映射可以将多个对象聚合到一个对象中。聚合映射可以是...

    hibernate学习笔记

    在 Hibernate 中,可以通过 `&lt;set&gt;` 标签来配置 Set 集合的映射。下面详细介绍 `&lt;set&gt;` 标签的各个属性: - **name**:必须指定的属性,表示集合的名称。 - **access**:可选属性,指定访问策略。 - **table**:可...

    HibernatJPA_Colecciones:映射集合

    在Hibernate中,集合可以通过`&lt;set&gt;`, `&lt;list&gt;`, `&lt;map&gt;`, `&lt;bag&gt;` 或 `&lt;array&gt;` 标签进行映射。每个标签对应不同的集合类型,例如: 1. `&lt;set&gt;`:对应Set接口,不允许有重复元素。 2. `&lt;list&gt;`:对应List接口,元素...

    nhibernate 类文件 映射文件 生成工具 NGen

    6. Bag、Set、List、Array、Map:用于表示集合类型的映射,如列表或映射关系。 NGen工具的主要功能是: 1. 预先编译:NGen会将IL(中间语言)代码转换为本机机器码,使得应用程序在运行时无需再进行JIT(Just-In-...

    hibernate inverse和cascade的详细讲解

    该属性仅存在于集合标记的元素中,如`&lt;set&gt;`、`&lt;map&gt;`、`&lt;list&gt;`、`&lt;array&gt;`和`&lt;bag&gt;`等。它的作用是决定是否将对集合对象的修改反映到数据库中。 - **Inverse 的作用** - **定义**:`inverse`属性决定了一端是否...

    面向中小型企业的交互式CAPP系统的设计与实现1

    5. **集合类型**:`set`、`map`、`list`、`bag`、`array`等元素定义了集合类型在Hibernate中的实现方式。 6. **继承策略**:`subclass`、`joined-class`、`union-class`等元素用于定义不同的继承策略。 #### 三、...

Global site tag (gtag.js) - Google Analytics