`
JavaCrazyer
  • 浏览: 3008710 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类

Hibernate温习(5)--集合属性映射

阅读更多

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
package com.javacrazyer.domain;

import java.util.HashSet;
import java.util.Set;

/**
 * 学生实体类 --> 按JavaBean的形式定义
 * 
 */
public class Student {
	private int id;  //OID 对象标识符
	private String name;
	//值类型的Set集合属性
	//值类型:没有OID的类
	//Hiberante框架要求集合属性必须定义成接口类型,在真正运行时Hibenrate会根据要求把实现类替换掉
	private Set<String> hobbies = new HashSet<String>();
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<String> getHobbies() {
		return hobbies;
	}

	public void setHobbies(Set<String> hobbies) {
		this.hobbies = hobbies;
	}

	@Override
	public String toString(){
		return "id=" + id + ",name=" + name;
	}
	
	
	
}
 对应的映射文件Student.hbm.xml
<?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="com.javacrazyer.domain.Student" table="student">
		<id name="id" column="id">
            <generator class="native"/>
        </id>
        <property name="name" column="name"/>
        <!--这样就可以生成了两个表了,一个是上边的student,一个是stu_hobby-->
		<set name="hobbies" table="stu_hobby" order-by="hobby_name desc">
            <!--外键,命名是stu_id,引用自student表的主键-->
			<key column="stu_id"/>
			<element column="hobby_name" type="string"/>
		</set>
	</class>
</hibernate-mapping>
 2.List 集合属性
【将studetn.java的集合属性换成: private List<String> hobbies = new ArrayList<String>();】

List是有序集合,因此持久化到数据库时也必须增加一列来表示集合元素的次序。看持久化类,该 Student.java类有个集合属性:hobbies ,该属性对应爱好。而集合属性只能以接口声明,因此代码中,hobbies  的类型能是List ,不能是ArrayList ,但该集合属性必须使用实现类完成初始化。【无论是种类型的集合属性都要遵守这个规定】

在作相应映射时,list元素要求用list-index的子元素来映射有序集合的次序列。集合的属性的值会存放有另外的表中,不可能与持久化类存储在同一个表内。因此须以外键关联,用Key元素来映射该外键列。

 

<list name="hobbies" table="stu_hob3">
	<key column="stu_id"/>
	<list-index column="posistion"/>
	<element column="hobby_name" type="string"/>
</list>

  3. bag 元素映射

【将student.java换成对应的List的或者Coollection的,比如:private Collection<String> hobbies = new ArrayList<String>();】

 

bag 元素既可以为 List 集合属性映射,也可以为 Collection 集合属性映射。不管是哪种集合属性,使用 bag 元素都将被映射成无序集合,而集合属性对应的表没有

<bag name="hobbies" table="stu_hob2">
	<key column="stu_id"/>
	<element column="hobby_name" type="string"/>
</bag>
 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 。映射文件如下:
<map name="hobbies" table="stu_hob5">
	<key column="stu_id"/>
	<map-key column="hob_id" type="string"/>
	<element type="string" column="hob_name"/>
</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 集合属性的表总是以外键和元素次序列作为联合主键。





 

分享到:
评论
2 楼 因为java所以java 2010-11-12  
知道了 openSessionInView 晕
1 楼 因为java所以java 2010-11-12  
请教一下楼主啊,"对于集合属性,通常推荐使用延迟加载策略",但是我们取到的对象会传到view层,在view层里取出关联对象的值,可是这个时候session已经自动关闭了,我们还是得去掉lazy,但是这样明显效率不高了,而且并不是每一个关联的集合都会用到,请问楼主有什么好的建议吗?  难道在查询的时候有定制的设置fetch吗?

相关推荐

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    《深入理解Hibernate配置与映射:hibernate-configuration-3.0.dtd与hibernate-mapping-3.0.dtd解析》 在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而`hibernate-...

    hibernate-release-5.2.10

    2. **库文件**:包含jar包,如hibernate-core.jar、hibernate-entitymanager.jar等,这些是我们在项目中引入Hibernate时需要用到的依赖库。 3. **文档**:通常包括用户指南、API文档、开发者文档等,这些文档提供了...

    hibernate-commons-annotations-5.0.1.Final.jar

    总结,`hibernate-commons-annotations-5.0.1.Final.jar`是Hibernate框架的重要组成部分,通过提供丰富的元数据注解,简化了Java对象与数据库之间的映射工作。对它的源码进行深入学习,不仅能够增强对JPA和Hibernate...

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip)

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate-release-5.0.7.Final的所有jar包

    5. **hibernate-c3p0**和**hibernate-ehcache**: 这两个是连接池和缓存服务的提供者,分别对应C3P0和Ehcache。它们用于优化数据库连接的获取和释放,以及缓存数据,提高性能。 6. **hibernate-commons-annotations*...

    hibernate-commons-annotations-4.0.1.Final.jar

    hibernate-commons-annotations-4.0.1.Final.jar

    Hibernate 离线的配置方法(hibernate-mapping-3.0.dtd)

    因为Hibernate在读出hbm.xml文件时需要通过网络读取到hibernate-mapping-3.0.dtd 文件。 如果没有网络不能正常工作。 所以提供上述文件。 以及hibernate-mapping-3.0.dtd,hibernate-configuration-3.0.dtd提供下载...

    hibernate-release-5.0.0.Final(1).zip

    本次我们将深入探讨的版本是`hibernate-release-5.0.0.Final(1)`,这个版本在Hibernate的生命周期中具有重要的地位,它引入了多项新特性和改进,旨在提升开发效率和性能。 一、Hibernate概述 Hibernate是Java领域中...

    hibernate-extensions-2.1.3.zip ,middlegen for hibernate

    Middlegen,作为`Middlegen-Hibernate-r5.zip`的主要内容,是针对Hibernate的一个实用工具,用于自动生成数据库模式到Java类的映射代码,极大地提高了开发效率。 1. Hibernate扩展: Hibernate扩展是开发者社区为...

    hibernate-release-4.2.4.Final.zip

    7. **实体类与映射文件**:在Hibernate中,每个数据库表对应一个Java实体类,实体类的属性对应表的字段,而映射文件(如.hbm.xml)则定义了这些映射关系。Hibernate使用注解或XML文件来完成映射,使得Java对象可以...

    hibernate-release-5.0.7.Final.zip

    而"hibernate-release-5.0.7.Final"目录则可能包含源码、文档、示例项目等,是深入学习和研究Hibernate的好材料。 总之,Hibernate 5.0.7.Final为Java开发带来了极大的便利,通过传智播客黑马程序员2016版的框架,...

    hibernate-cglib-repack-2.1_3.jar

    《深入理解Hibernate-CGLIB-2.1_3在Java开发中的应用》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而CGLIB则是一个代码生成库,它允许开发者在运行时动态创建子类...

    hibernate-mapping-3.0.dtd

    hibernate-mapping-3.0.dtd 最新从官网下载,无损无修改

    hibernate-cglib-repack-2.1_3.jar.zip

    《深入理解Hibernate-CGLIB-2.1_3在Java开发中的应用》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而CGLIB则是一个代码生成库,它允许开发者在运行时动态创建子类...

    hibernate-common-annotations.jar

    《hibernate-common-annotations.jar:Hibernate ORM框架中的核心注解库详解》 在Java世界里,ORM(Object-Relational Mapping)框架是连接数据库与应用程序的重要桥梁,而Hibernate作为其中的佼佼者,深受广大...

    Hibernate稳定版(hibernate-release-5.6.2.Final.zip)

    Hibernate稳定版(hibernate-release-5.6.2.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate-configuration-3.0.dtd

    hibernate-configuration-3.0.dtd 文件,配置后 映射文件就会提示

    hibernate-entitymanager-3.4.0.GA.rar

    hibernate-entitymanager-3.4.0.GA.rar hibernate-entitymanager-3.4.0.GA.rar hibernate-entitymanager-3.4.0.GA.rar hibernate-entitymanager-3.4.0.GA.rar hibernate-entitymanager-3.4.0.GA.rar hibernate-...

Global site tag (gtag.js) - Google Analytics