集合映射
如果实体类有一个集合类型的属性,就需要一张额外的表,即所谓的集合表,这
个表有一个外键引用实体类对应的表的主键。
根据集合中存放的元素类型可以分为两种:1,值类型集合,元素是可识别的数据
库类型,如基本数据类型或字符串类型等;2,实体类型集合,元素是其他的实体。
** 对集合做映射时一般需要指定:
1)集合表的表名,在相应元素中使用属性table指定;
2)集合外键,是在子元素key中用属性column属性指定一个列名,他是一个外键
引用了实体表的主键;
3)集合元素,对于值类型集合,使用元素element指定;对于实体类型集合,使
用元素one-to-many或many-to-many。
4)如果是索引集合,如List,数组或Map(bag不是),还需要指定一个集合表中
的索引字段,用于对应到数组索引或List的索引,或者Map的key。
a) 如果是List或数组,需要指定(集合表中的)一个用于保存索引的列,用
元素list-index指定。
b) 如果是Map:key用map-key元素指定;如果key是一个实体引用,则是通过
map-key-many-to-many来配置。
JAVA的实体类中集合只能定义成接口不能定义成具体类,因为在运行时集合会被
替换成Hibernate的实现。
在实体类中声明集合时,可进行初始化。比如Set addresses = new HashSet();
这样做的目的是方便往集合中添加元素,调用getAddresses().add(element)就可
以了,不需再做是否为null的判断。 注意,我们只在把addresses初始化为一个
HashSet的实例,在运行时,集合会被Hibernate替换为自已的实现。
用于映射集合类的元素是由集合接口的类型决定的:
<set> 元素用来映射 java.util.Set 类型的属性;
<list> 元素用来映射 java.util.List 类型的属性;
<array>元素用来映射 对象类型的数组;
<primitive-array>元素用来映射 原始数据类型的数组;
<bag> 元素用来映射 java.util.List 类型的属性(允许重复但没有顺序);
<map> 元素用来映射 java.util.Map 类型的属性;
1,Set,一个用户(User)有多个地址,地址是字符串类型的。
<set name="addresses" table="itcast_useraddresses">
<key column="userId"></key>
<element type="string" column="address"></element>
</set>
2,List,与Set相比,需要在表中增加一列用于保存索引(元素在List中保存的
顺序,不对应实体的任何属性)。用<list-index>元素指定:
<list name="phoneNumbers" table="itcast_user_phonenumbers">
<key column="userId"></key>
<list-index column="idx"></list-index>
<element type="string" column="phoneNumber"></element>
</list>
3,a) 对象类型数组,跟配置list类似,只不过把list-index元素替换为index元
素,作用一样:
<array name="addresses2" table="itcast_user_addresses2">
<key column="userId"></key>
<index column="idx"></index>
<element type="string" column="address"></element>
</array>
b) 原始类型数组,把array元素名替换为array:
<primitive-array name="phoneNumbers2" table="user_phonenumbers2">
<key column="userId"></key>
<index column="idx"></index>
<element type="integer" column="phoneNumber"></element>
</primitive-array>
4,bag,可以有重复元素,但不保存顺序。实体中声明为java.util.List类型
(不用指定list-index,因为bag不保存顺序):
<bag name="addresses3" table="itcast_user_addresses3">
<key column="userId"></key>
<element type="string" column="address"></element>
</bag>
5,Map,需要映射key的value:
<map name="phoneNumbers3" table="itcast_user_phonenumbers3">
<key column="userId"></key>
<map-key type="string" column="idx"></map-key>
<element type="string" column="phoneNumber"></element>
</map>
* 有序集合
有两种方式实现:
a) 使用sort属性实现在内存中排序;
b) 使用order-by属性实现 在使用sql进行查询时使用order by指定顺序。
有序集合对于List或数组无效,因为列表元素的顺序由列表索引指明。
如果使用的是Set或Map类型的集合,并且在实体中对这个集合属性进行了初始化,
应是SortedSet或SortedMap实现类的实例(TreeSet或TreeMap)。
** sort属性
可以用于set或map映射,默认为unsorted,即不排序;可以设为natural,要求实
体要实现java.lang.Comparable接口。分类集合的行为象TreeSet或者TreeMap,
这是从数据库中取出记录后再在内存中进行排序。(在查询时有效)
** order-by属性
在set、bag或map映射中使用order-by属性,指定查询时生成的sql的order by子
句,这是在执行sql查询时指定排序(推荐)。如果使用了order-by,则返回的就
是可以保存顺序的集合实现类。
* 一对多与多对一映射:User与Group
在User.hbm.xml中增加:
<many-to-one name="group" column="groupId"></many-to-one>
在Group.hbm.xml中增加:
<set name="users">
<key column="groupId"></key>
<one-to-many class="User"/>
</set>
这是做的双向关联,即从任何一方都可以得到另一方(User.getGroup得到所属的
组或Group.getUsers得到组中所有的用户);双方也都可以维护关系,维护关系
是指更新外键这一列的的值; 如果只有一方进行映射,就是单向关联。 如果去
掉了User.hbm.xml中的many-to-one映射,只有Group.hbm.xml中有一个set的映射,
这就是单向一对多关联,这时只能由Group维护关系,并且只能从Group得到User。
同样,如果只去掉Group.hbm.xml中的set映射,就是单向多对一关联。
树形结构,就是自己和自己是一个一对多的关系。如Group有父组和子组,映射文件
中为:
<many-to-one name="parent" column="parentId"/>
<set name="children">
<key column="parentId"/>
<!-- 集合中的元素还是Group -->
<one-to-many class="Group"/>
</set>
* 一对一映射:User与IdCard
有两种映射方式:基于主键和一对一和基于外键和一对一(用数据库说明)。不
管哪种方式,都是有外键的那个表对应的实体(IdCard)来维护关系;只为只有
IdCard能维护关系,所以如果要做单向关联,只能做从IdCard到User的单向关联。
不管是多对一还是一对一,有外键的那个表所对应的实体始终能够维护关系。
** 基于主键的一对一
在IdCard.hbm.xml中把主键生成策略改为foreign,并设置one-to-one:
...
<generator class="foreign">
<param name="property">user</param>
</generator>
...
one-to-one name="user" constrained="true"></one-to-one>
属性constrained="true"表示该类对应的表的的主键同时作为外键引用User
表的主键,默认为false。
在User.hbm.xml中增加:
<one-to-one name="idCard"></one-to-one>
** 基于外键的一对一
在IdCard.hbm.xml中增加:
<many-to-one name="user" column="userId" unique="true"/>
其中属性unique="true"说明这一列的值是唯一的,不能重复。基于外键的一
对一其实就是多对一的一个特例。
在User.hbm.xml中增加:
<one-to-one name="idCard" property-ref="user"></one-to-one>
!!其中property-ref属性用来指定关联类的一个属性,这个属性将会和外
键相对应,如果没有指定,会使用对方关联类的主键(所以上面的基于主键
的一对一时不用指定)。
* 多对多映射:Group与Role
在Group.hbm.xml中增加:
<set name="roles" table="itcast_groups_roles">
<key column="groupId"></key>
<many-to-many class="Role" column="roleId"></many-to-many>
</set>
在Role.hbm.xml中增加:
<set name="groups" table="itcast_groups_roles">
<key column="roleId"></key>
<many-to-many class="Group" column="groupId"></many-to-many>
</set>
双方一定要在set元素中指定相同的表名(这是指定的中间表的名字)。元素
many-to-many 的class 属性用于指定关联类(集合中的实体元素)的名称;因为
是多对多,关联类在中间表中也是用一个外键指定的,many-to-many中的column
属性用于指定这个外键的列名。
这是做的双向关联,此时双方都可以维护关系。去掉任何一方的映射,就是单向
的双对多关联。
* 属性:lazy
延迟加载,默认值为true,即集合的属性值默认是不加载的。强制加载可以通过
在session环境中使用这个集合属性或者使用:Hibernate.initialize(proxy);
当相关联的session关闭后,再访问懒加载的对象将出现异常。
分享到:
相关推荐
"自动生成 Hibernate 映射文件和实体类" 自动生成 Hibernate 映射文件和实体类是使用 MyEclipse 工具来实现的,这可以大大提高开发效率,减少开发时间。下面将详细介绍如何使用 MyEclipse 自动生成 Hibernate 映射...
hibernate映射文件是Java开发中用于对象关系映射(ORM)的重要组成部分,它将数据库表与Java类之间的关系进行定义,使得开发者无需编写大量的SQL语句,就能实现对数据库的操作。`生成hibernate映射文件工具`是为了...
首先,我们需要了解Hibernate映射文件的基本结构。通常,一个映射文件以`.hbm.xml`为扩展名,它使用XML格式来描述Java类和数据库表的对应关系。映射文件包含了类名、表名、字段及其数据类型等信息。例如: ```xml ...
**hibernate映射与查询** Hibernate 是一个流行的 Java 应用程序开发框架,它提供了一个持久层解决方案,简化了数据库操作。对于初学者来说,理解 Hibernate 的映射和查询机制是至关重要的,因为它们构成了 ...
【压缩包子文件的文件名称列表】:“hibernate映射文件自动生成.doc”很可能是这篇博文的文档形式,其中详细介绍了具体的操作步骤、使用工具或者自定义脚本,以帮助开发者理解并应用自动化的映射文件生成过程。...
Hibernate映射文件是XML格式的文件,它定义了数据库表与Java实体类之间的对应关系,包括字段映射、主键策略、关联关系等。映射文件让开发者无需编写SQL语句,就能通过Java对象进行数据库操作。 2. **MyEclipse ...
build.xml 手写自动生成Hibernate映射文件和配置文件源代码
### 常用Hibernate映射配置详解 #### 1. hibernate-mapping节点解析 `hibernate-mapping`节点是Hibernate映射文件中的顶级节点,用于定义一系列配置选项,控制整个映射文件的行为和映射规则。这些配置包括数据库...
3. **逆向工程(Hibernate Reverse Engineering)**:选中要映射的数据库表,右键选择`Hibernate Reverse Engineering`,这是MyEclipse提供的将数据库表转换为Hibernate映射文件和实体类的工具。 4. **配置生成选项...
### Hibernate映射笔记详解 #### Hibernate映射文件与配置关系 Hibernate映射是ORM(对象关系映射)框架中的一项关键技术,它允许开发者在数据库表和Java对象之间建立映射关系,从而简化了数据访问层的开发工作。...
而MyEclipse作为一款强大的Java集成开发环境,提供了对Hibernate的良好支持,包括自动生成Hibernate映射文件的功能。本文将详细介绍如何在MyEclipse中创建和使用Hibernate映射文件。 首先,理解Hibernate映射文件...
确保数据库与Hibernate映射文件一致,能正确地反映实体之间的关系。导入DBO到SQL Server数据库后,就可以通过Hibernate的Session接口进行CRUD(创建、读取、更新、删除)操作了。 在开发过程中,理解并熟练运用这些...
"Hibernate映射配置实例大全"是一个全面深入的资源,旨在帮助开发者理解和掌握如何有效地配置Hibernate以实现对象关系映射(ORM)。在这个文档中,我们将探讨各种关键的映射配置方法,以及相关的实例。 首先,我们...
标题“Hibernate映射树形结构”指的是如何用Hibernate来存储和操作具有层级关系的数据。 1. **单表映射策略**: Hibernate可以使用单个表来存储树形结构,通过一个自增的`id`字段以及一个表示父节点的`parent_id`...
本文将详细探讨如何使用Hibernate映射集合属性List,以及如何让Hibernate自动创建对应的数据库表,无需手动编写SQL语句。 首先,我们需要理解Hibernate的映射机制。Hibernate通过ORM(对象关系映射)技术将Java对象...
Hibernate映射文件,通常以`.hbm.xml`为扩展名,是Hibernate用来定义Java类与数据库表之间关系的配置文件。它包含了关于实体类与数据库表的字段对应、主键生成策略、关联关系等信息。通过这些映射文件,Hibernate...
【hibernate映射解析—七种映射关系】 对象关系映射(ORM,Object Relational Mapping)是一种技术,它允许开发人员使用面向对象的编程语言处理数据库,从而避免了直接编写SQL语句的繁琐工作。Hibernate是一个流行...
下面我们将详细介绍如何在MyEclipse中自动生成Hibernate映射文件。 首先,我们需要建立数据库连接。在MyEclipse中,可以通过`Window`菜单打开`MyEclipse Database Explorer`视图。在这里,你可以创建新的数据库连接...