`
pany
  • 浏览: 90521 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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>  

  !-- 一定要把inverse属性设置成inverse= 'false' ,否则item_index_无法更新 -->          

<list name="items"  table="item" inverse="false" cascade="all-delete-orphan" lazy="false">  
            <key column="question_id_"></key>  
            <index column="item_index_"></index>  
            <one-to-many class="com.vote.model.Item"/>  
</list> 
 

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 集合属性时,同样需要指定外键列,同时还必须指定 MapKey 列。显然,系统将以外键列和 Key 列作为联合主键。
与所有集合属性类似,属性声明只能使用接口,看下面的 POJO 类:

    private Map school=new  HashMap();     
              
    public Map getSchool() {     
        return school;     
    }     
    public void setSchool(Map school) {     
       this.school=school;     
    }  
 

Map 集合属性使用 map 元素映射时,该 map 元素需要 keymap-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-keyelement 元素都必须确定type属性

5. 集合性能的分析
对于集合属性,通常推荐使用延迟加载策略。所谓延迟加载就是当系统需要使用集合属性时才从数据库装载关联的数据。
Hibernate 对集合属性默认采用延迟加载,在某些特殊的情况下为 set,,list,map 等元素设置lazy="false" 属性来取消延迟加载。
可将集合分成如下两类:

  • 有序集合:集合里的元素 可以根据 KeyIndex 访问
  • 无序集合:集合里的元素中能遍历

有序集合的属性有增加、删除及修改中拥有较好的性能表现。在设计较好的 Hiberate domain Object 中,集合属性通常都会增加 inverse="true" 的属性,此时集合端不再控制关联关系。映射 Set 集合属性时,如果 element 元素包括 not-null="true" 属性,则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键,但 List 集合属性的表总是以外键和元素次序列作为联合主键。

分享到:
评论

相关推荐

    Hibernate中映射枚举类型

    ### Hibernate中映射枚举类型 #### 概述 Hibernate是一种强大的对象关系映射(ORM)框架,它允许开发者以面向对象的方式操作数据库。在实际应用中,经常会遇到需要将Java中的枚举类型映射到数据库的情况。枚举类型...

    Hibernate集合属性的延迟加载.doc

    在给定的文档中,我们看到一个例子,展示了如何在 Hibernate 中配置一个具有集合属性的实体类 `Person`,以及如何通过映射文件启用延迟加载。`Person` 类拥有一个 `Set&lt;Address&gt;` 类型的 `addresses` 属性,表示个人...

    GPS JAVA笔试题目(第二套)-新锐互动.doc

    5. Hibernate中映射集合属性: 对于Customer类中的Set类型的orders属性,应使用`&lt;set&gt;`元素进行映射。 6. Hibernate的延迟检索策略问题: 在给定代码中,对Customer类的orders集合采用延迟检索策略,但在事务提交...

    Hibernate映射集合属性List

    在Java持久化框架Hibernate中,映射集合属性是常见的需求,特别是对于那些具有一对多、多对多关系的实体对象。这里的"List"是Java集合框架中的一个接口,用于存储一组有序的元素,而在Hibernate中,它常用来映射...

    Hibernate 对集合属性的操作.zip_hibernate

    本资料重点探讨的是Hibernate对集合属性的操作,这是在实际项目开发中常见的需求,例如处理一对多、多对一、多对多等关联关系。下面将详细介绍Hibernate对集合属性的管理和操作。 1. **集合类型**:在Hibernate中,...

    hibernate应用开发完全手册源码(5-16)

    在Hibernate中映射关联关系、事务应用、检索策略、映射值类型集合等高级应用;小型网站或应用程序的开发思路、方法和过程;基于Struts+Hibernate开发网站的基本思路、方法和过程,包括运用Struts+Hibernate开发物资...

    Hibernate帮助文档集合

    Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate...

    hibernate set 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...

    hibernate map 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便更好地管理和操作数据。这篇文章将深入探讨Hibernate中的集合映射机制,包括其基本概念、类型以及如何在实际开发中进行...

    Hibernate学习文档集合

    《Hibernate学习文档集合》 Hibernate,作为Java领域中的一款强大且广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。本集合包含了三个关键的学习文档,分别关注于Hibernate的操作基础、对象关系映射和...

    hibernate bag 集合映射

    标题中的“hibernate bag 集合映射”指的是Hibernate框架中的一种关系映射机制。Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者将数据库表与Java类进行映射,使得在处理数据库操作时可以使用面向...

    Hibernate的关联关系映射图解

    Hibernate4中映射关系图解。

    hibernate中的集合映射范例程序

    在这个“hibernate中的集合映射范例程序”中,我们将深入探讨如何在Hibernate中进行集合映射,以及不同集合类型的应用场景。 首先,集合映射是Hibernate中处理一对多、多对多关系的核心机制。它允许我们将一个实体...

    hibernate4源码集合

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate-search-analyzers-4.1.1.Final-sources.jar hibernate-search-engine-4.1.1.Final-sources.jar hibernate-search-orm-4.1.1.Final-sources.jar hibernate-...

    hibernate list集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表与Java对象的集合属性关联的过程。List集合映射是其中常见的一种方式,它允许我们将数据库中的一组相关记录映射到Java对象的List列表中。这种映射机制使得...

    hibernate的_CascadeType属性说明

    Hibernate的CascadeType属性说明 Hibernate框架中,CascadeType是hibernate的重要属性之一,它控制着实体之间的级联操作。CascadeType是hibernate中的枚举类型,定义了多种级联操作,包括REFRESH、PERSIST、REMOVE...

    hibernate集合的映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便实现对象关系映射(ORM)。本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际...

    hibernate-validator数据校验jar集合

    `Hibernate Validator`是一个开放源代码项目,由Hibernate团队维护,它基于JSR 303(Bean Validation 1.0)和JSR 349(Bean Validation 1.1)标准,用于在Java应用中执行对象级验证。 `Hibernate Validator`的主要...

    Hibernate集合映射与关联关系

    对于"student与Score的Map集合关系",在Hibernate配置文件中,我们需要定义两个实体(Student和Score),并在Student实体中声明一个Map类型属性,用于存储Score对象。映射关系可以通过`@OneToMany`和`@ManyToOne`...

Global site tag (gtag.js) - Google Analytics