关联关系映射文档格式.docx
《关联关系映射文档格式.docx》由会员分享,可在线阅读,更多相关《关联关系映射文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
单向关联指具有关联关系的实体对象之间的加载关系是单向的。
它意味着,在具有关联关系的两个实体对象中,只有一个实体对象可以访问对方。
如图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-mappingpackage="
com.lyq.model"
classname="
Book"
table="
tb_book_manytoone1"
<
--主键-->
idname="
id"
generatorclass="
native"
/>
/id>
--图书名称-->
propertyname="
name"
not-null="
true"
length="
200"
/>
--作者-->
author"
50"
--多对一关联映射-->
many-to-onename="
category"
class="
Category"
--映射的字段-->
columnname="
categoryId"
/many-to-one>
/class>
/hibernate-mapping>
Hibernate的多对一单向关联是使用<
many-to-one>
标签进行映射,此标签用在多的一端。
其中,name属性用于指定持久化类中相对应的属性名,class属性指定与其关联的对象。
此外还需要指定数据表中所映射的字段,它使用子标签<
column>
进行设置,<
标签的name属性用于一的一端的主键标识。
创建ExportTables类,在main()方法中将数据表导出。
其关键代码如下:
publicstaticvoidmain(String[]args){
//加载配置信息
Configurationcfg=newConfiguration().configure();
//实例化SchemaExport对象
SchemaExportexport=newSchemaExport(cfg);
//导出数据表
export.create(true,true);
}
运行此类,将在数据库中创建图书信息表与图书类别表。
例15.02
多对一单向关联映射中对象的加载,代码如下。
光盘\TM\Instances\15.02)
publicclassTest{
Sessionsession=null;
//声明Session对象
try{
//获取Session
session=HibernateUtil.getSession();
//开启事务
session.beginTransaction();
//查询图书对象
Bookbook=(Book)session.get(Book.class,newInteger
(1));
System.out.println("
图书名称:
+book.getName());
图书类别:
+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对象的映射文件通过<
set>
标签进行映射。
代码如下:
光盘\TM\Instances\15.03)
tb_Category_manytoone2"
--类别名称-->
--一对多映射-->
setname="
books"
keycolumn="
one-to-manyclass="
/set>
标签用于映射集合类型的属性,其中name属性用于指定持久化类中的属性名称。
此标签通过子标签<
key>
指定数据表中的关联字段,对于一对多关联映射通过<
one-to-many>
标签进行映射,其class属性用于指定相关联的对象。
例15.04
多对一双向关联映射中对象的加载,代码如下:
光盘\TM\Instances\15.04)
*********查询图书对象************"
);
Bookbook1=(Book)session.get(Book.class,newInteger
(1));
+book1.getName());
+book1.getCategory().getName());
*********查询类别对象************"
//查询类别对象
Categoryc=(Category)session.load(Category.class,newInteger
(1));
类别名称:
+c.getName());
Set<
Book>
books=c.getBooks();
//获取类别中的所有图书
//通过迭代输出图书名称
for(Iterator<
it=books.iterator();
it.hasNext();
){
Bookbook2=(Book)it.next();
+book2.getName());
由于配置了图书与类别之间的多对一双向关联映射,所以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)
hibernate-mapping>
com.lyq.model.User"
tb_user_onetoone_p"
--主键id-->
--姓名-->
username"
--年龄-->
age"
--一对一映射-->
one-to-onename="
idCard"
IdCard对象的主键参照了User对象的外键,其映射文件IdCard.hbm.xml的关键代码如下。
com.lyq.model.IdCard"
tb_idCard_onetoone_p"
--参考User的外键-->
foreign"
paramname="
property"
user<
/param>
/generator>
--证件号-->
num"
user"
constrained="
one-to-one>
标签用于建立一对一关联映射,其中name属性用于指定持久化类中的属性名称;
constrained属性用于建立一个约束,它表明IdCard对象的主键参照了User
的外键。
IdCard的主键生成策略为foreign,此种方式通过<
parm>
标签配置主键的来源。
运行此类,将在数据库中创建用户表与证件表。
15.1.5
一对一外键关联映射
除一对一主键关联映射外,还有一对一外键关联映射。
这种映射方式在其中一端加入一个外键指向另一端,其映射后形成的数据表如图15.10所示。
图15.10
表关系
从图15.10中可以看出,这种映射方式与多对一映射方式相似,如果能限制User对象中IdCard的唯一性,那么二者之间实质上就构成了一对一关联关系。
例15.06
用户(User)对象与证件(IdCard)对象为一对一的关联关系,在二者之间建立一对一外键关联映射。
其中IdCard的映射文件IdCard.hbm.xml的关键代码如下:
光盘\TM\Instances\15.06)
tb_idCard_onetoone_f"
User对象的映射文件User.hbm.xml的关键代码如下:
tb_user_onetoone_f"
unique="
在IdCard对象的映射文件中,并没有发生太大的变化,它只不过进行了普