`

hibernate之Collection类型

阅读更多

 

  • Collection类型:

 

在Hibenrate中的一对多,多对多关系中,Collection占着比较重要的地位;在Hibernate中支持几种类型的Collection?他们之间的差异何在?

在Hibernate中涉及的Collection类型(传统的java Set,Map,List实现不能满足要求,Hibernate根据这些接口提供了自己的实现,下面的Set,Bag,Map均指的是HIbernate中的实现)有:

1,无序集合:Set,Bag,Map;

2,有序结合:List;

无序和有序,是针对HIbenate数据持久过程中的,是否保持数据集合中的记录排列顺序加以区分的;有序集的数据集合,HIbernate在持久化过程中,会将集合中元素排序的先后顺序同时固化到数据库中(以某个特定的字段值储存顺序),当读取时,也会返回一个具备同样个排列顺序的数据集合;

 

  • set

 

HIbernate Set遵循java Collection中关于Set的定义,即集合中不允许出现两个相同元素;

 

TUser user = new TUser();
user.setName("keith");
set.add(user);
set.add(user);
System.out.println("user size:"+user.size());

 

 虽然执行了两次add()操作,但是Set结构中只包含了一个引用;

Hibernate在返回关联对象集合的时候,会自动为每个记录构建一个实体对象;如:TUser对象中有 Set<Book> books属性;在添加的时候添加了5本Book;那么hibernate就会构造出5个Book对象,放在TUser的Set<Book> books集合中返回,即使这5个book记录的逻辑内容完全相同(id不同);这是通过实体对象进行映射,如果通过String对book表中的字段进行映射,就会出现问题。将映射的类型改为String(原来为com.keith.Book);那么hibernate就会只构造出一条记录进行返回(因为java.lang.String会比较两个字符串的内容,如果这样比较的话5个book内容是一样的,那么Set中又不允许出现同样的值,这样的话就会保存1条记录);添加湿这样,那么删除也会出现相同的错误;

为了补充Set数据类型在这方面的限制,HIbernate提供了Bag类型;

 

  • Bag
Bag:是Hibernate自定义的集合类型,实现了一个允许包含重复元素的“set”;它的底层是接触了list实现,却屏蔽了List的有序性,通过“bag”声明的数据集合,其元素排序顺序不会被持久化;
当我们将<set>替换成<bag>时;即使加入了相同的book,也会往数据库里添加了3条记录;
bag集合为无序集合,且允许出现重复元素,也会带来问题,当删除某个元素的时候,我们该如何定位这条记录?因为数据库里存在多条相同的元素,bag的实现方式,实际上是先将库表中原有的集合数据全部删除,再将现有的数据逐条插入,但是这种方式的数据更新的性能很低;对于这样的情况,如果集合中的每个元素都有一个id可以唯一检索到对应的数据库记录。
那么出现了idBag,作为bag的一种延伸,则可以解决这个问题;
		<idbag name="books" lazy="true" table="_books"> 
			<collection-id type="int" column="id">
				<generator class="identy"></generator>
			</collection-id>
			<key column="user_id" />
			<element type="string" column="books"/>
		</idbag>
 更详细的可查看hibernate官方文档;
  • Map
Map也是一个无序集合类型,与Set/Bag类型不同的是,Map提供了值/键对应关系;一个Map配置例子如下:
		<map name="books" lazy="true" table="_books">
			<key column="user_id"/>
			<index type="string" column="type"/>
			<element type="string" column="books"/>
		</map>
 与set配置相比,Map增加了一个<index>配置,用于指定用作Key的字段名,此字段要求在数据集中取值唯一;
  • List
List实现了集合内元素顺序的持久化,与Map集合需要额外字段保存键值一样,它要求库必须配属对应的字段以保存次序的信息;一个List配置例子如下:
		<list name="books" lazy="true" table="_books">
			<key column="user_id"/>
			<index type="integer" column="idx"/>
			<element type="string" column="books"/>
		</list>
 <index />节点中,我们指定以“idx”字段保存次序状态;

 

分享到:
评论

相关推荐

    Hibernate之数据加载方式

    **标题:“Hibernate之数据加载方式”** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它简化了数据库操作,提供了对象关系映射(ORM)的功能。本篇将深入探讨Hibernate的数据加载方式,帮助开发者更好地...

    hibernate父亲与孩子

    Hibernate提供了`org.hibernate.collection.internal.PersistentBag`这样的集合实现,可以支持懒加载和级联操作,帮助我们在查询时只获取必要的节点,而不是一次性加载整个树。同时,我们可以利用Hibernate的...

    HIBERNATE官方参考手册

    18. **集合映射(Collection Mapping)**:包括列表、集合、映射等多种集合类型的映射方式。 19. **实体生命周期方法(Lifecycle Methods)**:如`@PrePersist`、`@PostLoad`等注解定义的方法会在相应操作前后自动...

    hibernate set 集合映射

    1. **集合类型**:Hibernate支持多种集合类型映射,如Set、List、ArrayList、LinkedList、Map等。Set是最常见的集合映射类型,它不允许重复元素,与数据库中的唯一约束相对应。 2. **元素类型**:集合中的每个元素...

    hibernate中文文档

    9. **集合映射(Collection Mapping)**:Hibernate可以映射Java集合类型到数据库的关联关系,如List、Set、Map等,方便处理一对多、多对一、多对多的关系。 10. **Callback事件**:Hibernate提供了一些生命周期回...

    hibernate 2.1 和3.2的中文参考手册

    这个版本引入了对JDBC事务的支持,以及实体(Entity)和集合(Collection)的懒加载机制,这使得程序在处理大量数据时能够提高性能。此外,Hibernate 2.1还支持HQL(Hibernate Query Language),这是一种面向对象的...

    hibernate延迟加载解决

    ### Hibernate延迟加载详解 #### 一、什么是延迟加载?...总之,Hibernate的延迟加载机制是提高应用性能的重要手段之一。通过合理配置和使用这一机制,可以有效地优化应用程序的数据加载流程,提高用户体验。

    Hibernate_容器映射技术笔记

    本篇笔记主要探讨了如何使用Hibernate进行容器映射,特别是针对集合类型的映射,如List、Set和Map。 首先,我们来看集合类型在Hibernate中的映射: 1. **单值Collection**: 这种情况通常指的是一个对象与多个其他...

    hibernate3 中文API

    12. **集合映射(Collection Mapping)**: Hibernate支持多种集合类型(List、Set、Map等)的映射,以及一对多、多对一、一对一和多对多的关系映射。 通过阅读“Hibernate+Annotation+文档.pdf”,您可以深入学习...

    hibernate-dtd-xsd约束文件

    `hibernate-mapping-4.0.xsd`包含关于如何定义实体、关联(Association)、组件(Component)、集合(Collection)等的规则,而`hibernate-configuration-4.0.xsd`则定义了配置Hibernate会话工厂、缓存策略、事件...

    Hibernate+中文文档

    5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记...

    hibernate3.2中文文档(chm格式)

    5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记...

    hibernate面试题总结

    - **SQL**:可以直接执行SQL查询,但失去了Hibernate的一些优势,如自动类型转换和对象化结果集。 - **Criteria(QBC - Query By Criteria)**:基于对象的查询方式,提供了动态构建查询的能力,更加灵活,但可能...

    HibernateAPI中文版.chm

    5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    Hibernate是Java领域内最受欢迎的对象关系映射(ORM)框架之一,它简化了Java应用程序与关系型数据库之间的交互,使得开发人员能够用面向对象的方式处理数据库操作,而无需深入了解SQL语法或数据库API。通过将Java...

    Hibernate的延迟加载

    在Hibernate中,集合类型的延迟加载通过使用自定义的集合类实现,如`net.sf.hibernate.collection.Set`,而非标准的`java.util.Set`。这样,Hibernate可以在集合尚未被访问时,避免执行关联的数据加载。 启用集合...

    hibernate组件之间的关联

    在 Hibernate 中,组件之间的关联是实现对象模型与数据库表之间映射的关键部分,它包括了一对一、一对多、多对一、多对多等多种关联类型。本篇文章将深入探讨 Hibernate 组件之间的关联机制及其应用。 **一对一关联...

    常见hibernate面试题.doc

    - **导航对象图查询**:这是最基本的查询方式之一,适用于查询对象之间的关联关系。通过已知对象来导航到其他对象,比如通过一个`User`对象查询其关联的`Role`列表。 - **OID查询**:OID(Object Identifier)查询...

    hibernate结构框架及组要实现类的深入分析

    常见的级联类型有 `save-update`, `delete`, `all`, 和 `none`。例如,`cascade="save-update"` 表示保存或更新一个对象时,会同时保存或更新其关联的对象。 **控制反转(Inverse)** 在一对一或一对多关系中,控制...

Global site tag (gtag.js) - Google Analytics