关联关系映射.docx
- 文档编号:4702550
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:15
- 大小:52.29KB
关联关系映射.docx
《关联关系映射.docx》由会员分享,可在线阅读,更多相关《关联关系映射.docx(15页珍藏版)》请在冰豆网上搜索。
关联关系映射
Hibernate高级应用
(
视频讲解:
107分钟)
目前,持久层框架并非只有Hibernate,但在众多持久层框架中,Hibernate凭借着其强大的功能、轻量级的实现、成熟的结构体系等诸多优点从中脱颖而出,在Java编程中得到了广泛的应用。
本章将在第14章的基础上,对其进行更加深入的讲解。
通过阅读本章,您可以:
:
掌握实体对象关系的建立
:
掌握关联关系的映射方法
:
理解单向关联与双向关联
:
掌握对象间的级联操作
:
掌握继承映射
:
掌握HQL查询语言
15.1 关联关系映射
视频讲解:
光盘\TM\Video\15\关联关系映射.exe
Hibernate框架是一个ORM框架,它以面向对象的编程方式操作数据库。
在Hibernate中,“映射”发挥着巨大的作用,它将实体对象映射成数据表,实体对象的属性被映射为表中的字段,同样其实体之间的关联关系也是通过“映射”实现的。
15.1.1 单向关联与双向关联
在Hibernate框架中,实体对象之间的关系可分为一对一、多对一等关联关系,其关联类型主要分为“单向关联”与“双向关联”。
(1)单向关联
单向关联指具有关联关系的实体对象之间的加载关系是单向的。
它意味着,在具有关联关系的两个实体对象中,只有一个实体对象可以访问对方。
如图15.1所示,从学生对象中可以加载到班级信息,反过来则不行。
(2)双向关联
双向关联指具有关联关系的实体对象之间的加载关系是双向的。
它意味着,在具有关联关系的两个实体对象中,彼此都可以访问对方。
如图15.2所示,从学生对象中可以加载到班级信息,从班级对象中也可加载到学生的信息。
图15.1 单向关联
图15.2 双向关联
15.1.2 多对一单向关联映射
多对一单向关联映射十分常见,在学习其映射方法之前,首先来了解一下多对一单向关联的实体。
如图15.3所示,图书对象(Book)与图书类别对象(Category)为多对一的关联关系,多本图书对应一个类别,在Book对象中拥有Category的引用,它可以加载到一本图书的所属类别,而在Category的一端却不能加载到图书信息。
对于多对一单向关联映射,Hibernate会在多的一端加入外键与一的一端建立关联关系,其映射后的数据表如图15.4所示。
图15.3 多对一单向关联的实体对象
图15.4 映射后的数据表
例15.01 建立图书对象(Book)与图书类别对象(Category)的多对一关联关系,通过单向关联进行映射。
其关键的映射代码如下:
(实例位置:
光盘\TM\Instances\15.01)
xmlversion="1.0"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--主键-->
--图书名称-->
--作者-->
--多对一关联映射-->
--映射的字段-->
Hibernate的多对一单向关联是使用
其中,name属性用于指定持久化类中相对应的属性名,class属性指定与其关联的对象。
此外还需要指定数据表中所映射的字段,它使用子标签
创建ExportTables类,在main()方法中将数据表导出。
其关键代码如下:
publicstaticvoidmain(String[]args){
//加载配置信息
Configurationcfg=newConfiguration().configure();
//实例化SchemaExport对象
SchemaExportexport=newSchemaExport(cfg);
//导出数据表
export.create(true,true);
}
运行此类,将在数据库中创建图书信息表与图书类别表。
例15.02 多对一单向关联映射中对象的加载,代码如下。
(实例位置:
光盘\TM\Instances\15.02)
publicclassTest{
publicstaticvoidmain(String[]args){
Sessionsession=null; //声明Session对象
try{
//获取Session
session=HibernateUtil.getSession();
//开启事务
session.beginTransaction();
//查询图书对象
Bookbook=(Book)session.get(Book.class,newInteger
(1));
System.out.println("图书名称:
"+book.getName());
System.out.println("图书类别:
"+book.getCategory().getName());
//提交事务
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
//出错将回滚事务
session.getTransaction().rollback();
}finally{
//关闭Session对象
HibernateUtil.closeSession(session);
}
}
}
本实例中,Book对象持有Category对象的引用,从Book对象中可以得到Category对象的属性,实例运行结果如图15.5所示。
图15.5 实例运行结果
15.1.3 多对一双向关联映射
双向关联的实体对象都持有对方的引用,在任何一端都能加载到对方的信息。
多对一双向关联映射实质是在多对一单向关联的基础上,加入了一对多关联关系。
下面仍以图书对象(Book)与图书类别对象(Category)为例,讲解多对一双向关联映射,其实体关系如图15.6所示。
图15.6 多对一双向关联的实体对象
对于图书类别对象Category,它拥有多个图书对
象的引用,因此需要在Category对象中加入Set属性的图书集合books,对于其映射文件也通过集合的方式进行映射。
例15.03 建立图书对象(Book)与图书类别对象(Category)的多对一关联关系,通过双向关联进行映射,其中Book对象的映射文件与多对一单向关联中一致,并没有发生任何变化,而Category对象的映射文件通过
代码如下:
(实例位置:
光盘\TM\Instances\15.03)
xmlversion="1.0"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--主键-->
--类别名称-->
--一对多映射-->
此标签通过子标签
创建ExportTables类,在main()方法中将数据表导出。
其关键代码如下:
publicstaticvoidmain(String[]args){
//加载配置信息
Configurationcfg=newConfiguration().configure();
//实例化SchemaExport对象
SchemaExportexport=newSchemaExport(cfg);
//导出数据表
export.create(true,true);
}
运行此类,将在数据库中创建图书信息表与图书类别表。
例15.04 多对一双向关联映射中对象的加载,代码如下:
(实例位置:
光盘\TM\Instances\15.04)
publicclassTest{
publicstaticvoidmain(String[]args){
Sessionsession=null; //声明Session对象
try{
//获取Session
session=HibernateUtil.getSession();
//开启事务
session.beginTransaction();
System.out.println("*********查询图书对象************");
//查询图书对象
Bookbook1=(Book)session.get(Book.class,newInteger
(1));
System.out.println("图书名称:
"+book1.getName());
System.out.println("图书类别:
"+book1.getCategory().getName());
System.out.println("*********查询类别对象************");
//查询类别对象
Categoryc=(Category)session.load(Category.class,newInteger
(1));
System.out.println("类别名称:
"+c.getName());
Set
//通过迭代输出图书名称
for(Iterator
Bookbook2=(Book)it.next();
System.out.println("图书名称:
"+book2.getName());
}
//提交事务
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
//出错将回滚事务
session.getTransaction().rollback();
}finally{
//关闭Session对象
HibernateUtil.closeSession(session);
}
}
}
由于配置了图书与类别之间的多对一双向关联映射,所以Book对象与Category对象都持有对方的引用。
图书类别属于多对一中一的一端,在一个类别中拥有多本图书,Hibernate使用Set集合进行映射,因此当加载一个类别时,可以加载到类别中的所有图书。
实例运行结果如图15.7所示。
图15.7 实例运行结果
15.1.4 一对一主键关联映射
用户与身份证之间是一对一的关联关系,每一个用户对应一个身份证,同样每一个身份证也对应一个用户。
在Hibernate中,可将一对一关联映射分为主键关联映射与外键关联映射。
使用一对一主键关联映射时,其数据表的结构如图15.8所示。
从图15.8可以看出,IdCard的主键参照了User的外键,它与User对象的主键是一一对应的关系。
同样,Hibernate的一对一主键关联映射也分为单向与双向映射。
下面以双向映射为例进行讲解,其实体间的关系如图15.9所示。
图15.8 表关系
图15.9 实体关系
例15.05 用户(User)对象与证件(IdCard)对象为一对一的关联关系,二者之间通过一对一主键关联映射。
其中User的映射文件User.hbm.xml的关键代码如下:
(实例位置:
光盘\TM\Instances\15.05)
--主键id-->
--姓名-->
--年龄-->
--一对一映射-->
IdCard对象的主键参照了User对象的外键,其映射文件IdCard.hbm.xml的关键代码如下。
--主键id-->
--参考User的外键-->
--证件号-->
--一对一映射-->
IdCard的主键生成策略为foreign,此种方式通过
创建ExportTables类,在main()方法中将数据表导出。
其关键代码如下:
publicstaticvoidmain(String[]args){
//加载配置信息
Configurationcfg=newConfiguration().configure();
//实例化SchemaExport对象
SchemaExportexport=newSchemaExport(cfg);
//导出数据表
export.create(true,true);
}
运行此类,将在数据库中创建用户表与证件表。
15.1.5 一对一外键关联映射
除一对一主键关联映射外,还有一对一外键关联映射。
这种映射方式在其中一端加入一个外键指向另一端,其映射后形成的数据表如图15.10所示。
图15.10 表关系
从图15.10中可以看出,这种映射方式与多对一映射方式相似,如果能限制User对象中IdCard的唯一性,那么二者之间实质上就构成了一对一关联关系。
例15.06 用户(User)对象与证件(IdCard)对象为一对一的关联关系,在二者之间建立一对一外键关联映射。
其中IdCard的映射文件IdCard.hbm.xml的关键代码如下:
(实例位置:
光盘\TM\Instances\15.06)
--主键id-->
--证件号-->
User对象的映射文件User.hbm.xml的关键代码如下:
--主键id-->
--姓名-->
--年龄-->
--一对一映射-->
在IdCard对象的映射文件中,并没有发生太大的变化,它只不过进行了普
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关联 关系 映射