文档章节

Hibernate关联关系配置(一对多、一对一和多对多)

hephec
 hephec
发布于 2015/05/01 16:09
字数 1667
阅读 55
收藏 2
点赞 0
评论 0

Hibernate关联关系配置(一对多、一对一和多对多)

Hibernate关联关系配置

第一种关联关系:一对多(多对一)

"一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系。

一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多。

多对一:从订单的角度来说多个订单可以对应一个消费者,即为多对一。

 

一对多关系在hbm文件中的配置信息:

消费者(一方):

复制代码
<?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.suxiaolei.hibernate.pojos.Customer" table="customer"> <!-- 主键设置 --> <id name="id" type="string"> <column name="id"></column> <generator class="uuid"></generator> </id> <!-- 属性设置 --> <property name="username" column="username" type="string"></property> <property name="balance" column="balance" type="integer"></property> <set name="orders" inverse="true" cascade="all"> <key column="customer_id" ></key> <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/> </set> </class> </hibernate-mapping>
复制代码

订单(多方):

复制代码
<?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.suxiaolei.hibernate.pojos.Order" table="orders"> <id name="id" type="string"> <column name="id"></column> <generator class="uuid"></generator> </id> <property name="orderNumber" column="orderNumber" type="string"></property> <property name="cost" column="cost" type="integer"></property> <many-to-one name="customer" class="com.suxiaolei.hibernate.pojos.Customer" column="customer_id" cascade="save-update"> </many-to-one> </class> </hibernate-mapping>
复制代码

  "一对多"关联关系,Customer方对应多个Order方,所以Customer包含一个集合用于存储多个Order,Order包含一个Customer用于储存关联自己的Customer。

一对多关联关系有一种特例:自身一对多关联。例如:

 

自身一对多关联自身的hbm文件设置:

复制代码
<?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.suxiaolei.hibernate.pojos.Category" table="category"> <id name="id" type="string"> <column name="id"></column> <generator class="uuid"></generator> </id> <property name="name" column="name" type="string"></property> <set name="chidrenCategories" cascade="all" inverse="true"> <key column="category_id"></key> <one-to-many class="com.suxiaolei.hibernate.pojos.Category"/> </set> <many-to-one name="parentCategory" class="com.suxiaolei.hibernate.pojos.Category" column="category_id"> </many-to-one> </class> </hibernate-mapping>
复制代码

外键存放父亲的主键。

第二种关联关系:多对多

  多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。

数据表间多对多关系如下图:

多对多关系在hbm文件中的配置信息:

学生:

复制代码
<?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.suxiaolei.hibernate.pojos.Student" table="student"> <id name="id" type="integer"> <column name="id"></column> <generator class="increment"></generator> </id> <property name="name" column="name" type="string"></property> <set name="courses" inverse="false" cascade="save-update" table="student_course"> <key column="student_id"></key> <many-to-many class="com.suxiaolei.hibernate.pojos.Course" column="course_id"></many-to-many> </set> </class> </hibernate-mapping>
复制代码

课程:

复制代码
<?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.suxiaolei.hibernate.pojos.Course" table="course"> <id name="id" type="integer"> <column name="id"></column> <generator class="increment"></generator> </id> <property name="name" column="name" type="string"></property> <set name="students" inverse="true" cascade="save-update" table="student_course"> <key column="course_id"></key> <many-to-many class="com.suxiaolei.hibernate.pojos.Student" column="student_id"></many-to-many> </set> </class> </hibernate-mapping>
复制代码

  其实多对多就是两个一对多,它的配置没什么新奇的相对于一对多。在多对多的关系设计中,一般都会使用一个中间表将他们拆分成两个一对多。<set>标签中的"table"属性就是用于指定中间表的。中间表一般包含两个表的主键值,该表用于存储两表之间的关系。由于被拆成了两个一对多,中间表是多方,它是使用外键关联的,<key>是用于指定外键的,用于从中间表取出相应的数据。中间表每一行数据只包含了两个关系表的主键,要获取与自己关联的对象集合,还需要取出由外键所获得的记录中的另一个主键值,由它到对应的表中取出数据,填充到集合中。<many-to-many>中的"column"属性是用于指定按那一列的值获取对应的数据。

  例如用course表来说,它与student表使用一个中间表student_course关联。如果要获取course记录对应的学生记录,首先需要使用外键"course_id"从student_course表中取得相应的数据,然后在取得的数据中使用"student_id"列的值,在student表中检索出相关的student数据。其实,为了便于理解,你可以在使用course表的使用就把中间表看成是student表,反之亦然。这样就可以使用一对多的思维来理解了,多方关联一方需要外键那么在本例子中就需要"course_id"来关。


第三种关联关系:一对一
  一对一关系就球队与球队所在地之间的关系,一支球队仅有一个地址,而一个地区也仅有一支球队(貌似有点勉强,将就下吧)。数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。图示如下:

一对一外键关联:


一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系:

一对一外键关联在hbm文件中的配置信息:

地址:

复制代码
<?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.suxiaolei.hibernate.pojos.Adress" table="adress"> <id name="id" type="integer"> <column name="id"></column> <generator class="increment"></generator> </id> <property name="city" column="city" type="string"></property> <one-to-one name="team" class="com.suxiaolei.hibernate.pojos.Team" cascade="all"></one-to-one> </class> </hibernate-mapping>
复制代码

球队:

复制代码
<?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.suxiaolei.hibernate.pojos.Team" table="team"> <id name="id" type="integer"> <column name="id"></column> <generator class="increment"></generator> </id> <property name="name" column="name" type="string"></property> <many-to-one name="adress" class="com.suxiaolei.hibernate.pojos.Adress" column="adress_id" unique="true"></many-to-one> </class> </hibernate-mapping>
复制代码

  一对一外键关联,其实可以看做是一对多的一种特殊形式,多方退化成一。多方退化成一只需要在<many-to-one>标签中设置"unique"="true"。
一对一主键关联在hbm文件中的配置信息:

地址:

复制代码
<hibernate-mapping> <class name="com.suxiaolei.hibernate.pojos.Adress" table="adress"> <id name="id" type="integer"> <column name="id"></column> <generator class="increment"></generator> </id> <property name="city" column="city" type="string"></property> <one-to-one name="team" class="com.suxiaolei.hibernate.pojos.Team" cascade="all"></one-to-one> </class> </hibernate-mapping>
复制代码

球队:

复制代码
<hibernate-mapping> <class name="com.suxiaolei.hibernate.pojos.Team" table="team"> <id name="id" type="integer"> <column name="id"></column> <generator class="foreign"> <param name="property">adress</param> </generator> </id> <property name="name" column="name" type="string"></property> <one-to-one name="adress" class="com.suxiaolei.hibernate.pojos.Adress" cascade="all"></one-to-one> </class> </hibernate-mapping>
复制代码

一对一主键关联,是让两张的主键值一样。要使两表的主键相同,只能一张表生成主键,另一张表参考主键。

<generator class="foreign">

  <param name="property">adress</param>

</generator>

"class"="foreign"就是设置team表的主键参照adress属性的主键值。

本文转载自:

共有 人打赏支持
hephec
粉丝 1
博文 14
码字总数 831
作品 0
朝阳
程序员
Hibernate Hibernate关联映射

Hibernate映射关系概述: Hibernate关联映射分为: ①、多对一。②、一对多。③、一对一。④、多对多。⑤、组件映射。⑥、集合映射。 在Uml语言中关联是有方向的,以客户Customer和订单Order...

Winnie007 ⋅ 2015/08/06 ⋅ 0

Hibernate 级联和关系维护

1、Hibernate中的级联操作: 在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,就是级联,也就是说在操作当前实体时,针对当前实体的操作会影响到相应配置的关联实体,比如...

Winnie007 ⋅ 2015/08/28 ⋅ 0

Hibernate映射解析——七种映射关系

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的...

universeye ⋅ 2014/05/15 ⋅ 0

Hibernate(三)——框架中的关系映射

在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系。而Hibernate时间实体类和数据库中的...

凡尘里的一根葱 ⋅ 2015/11/11 ⋅ 0

hibernate七种对应关系映射

首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的...

无敌小学僧 ⋅ 05/17 ⋅ 0

hibernate(3)对象关联映射

1、概述 2、关联关系 3、一对多关联关系 一个班级有很多学生,设置students属性,关联表字段,班级选用班级外键GID 班级表: 学生表: 注:建立班级到学生的一对多单向关联,则学生表中包含班...

学而时习之 ⋅ 2015/04/24 ⋅ 0

Hibernate框架学习之注解配置关系映射

上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下...

Single_YAM ⋅ 2017/11/15 ⋅ 0

学习hibernate(五) -- hibernate映射关系

组合关系 在开发时,有一种情况,有一张数据表的数据来自于多个对象。比如,一个computer(电脑)表,其中有电脑的基本信息、CPU信息、显卡信息、主板信息和内存信息等等,对应的实体对象则是...

杰克鹏仔 ⋅ 2016/04/07 ⋅ 0

hibernate 基础

一、Hibernate工作原理: 读取并解析配置文件 读取并解析映射信息,创建SessionFactory 打开Sesssion 创建事务Transation 持久化操作 提交事务 关闭Session 关闭SesstionFactory 二、Hiberna...

scofi06 ⋅ 2010/09/01 ⋅ 0

hibernate面试题

一、Hibernate工作原理: 读取并解析配置文件 读取并解析映射信息,创建SessionFactory 打开Sesssion 创建事务Transation 持久化操作 提交事务 关闭Session 关闭SesstionFactory 二、Hiberna...

序写人生 ⋅ 2010/06/13 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Qt中的坑--QTreeWidget添加item 不能显示出来

QTreeWidget* pTree = ui.TreeCheckList; QTreeWidgetItem* item = new QTreeWidgetItem(pTree) ;item->setText ( 0, "test" );pTree->addTopLevelItem (item ); 原因是因为创建一个......

k91191 ⋅ 32分钟前 ⋅ 0

使用Guava的RateLimiter做限流

场景: 1. 在日常生活中,我们肯定收到过不少不少这样的短信,“京东最新优惠卷…”,“天猫送您…”。这种类型的短信是属于推广性质的短信。这种短信一般群发量会到千万级别。然而,要完成这...

wind2012 ⋅ 33分钟前 ⋅ 0

QSlider重新enterEvent

#ifndef DIALOG_H#define DIALOG_H#include <QDialog>namespace Ui {class Dialog;}class Dialog : public QDialog{ Q_OBJECTpublic: explicit Dialog(QW......

xxdd ⋅ 33分钟前 ⋅ 0

生产环境redis备份与恢复

生产环境redis备份与恢复 Tyrant0532 0人评论 1563人阅读 2018-02-01 20:34:10 redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。生产中我们主...

rootliu ⋅ 35分钟前 ⋅ 0

nginx中出现403forbidden错误

nginx “403 Forbidden” 错误 出现这个错误一般是因为以下原因: 网站禁止特定的用户访问所有内容,例:网站屏蔽某个ip访问。 访问禁止目录浏览的目录,例:设置autoindex off后访问目录。 ...

河图再现 ⋅ 36分钟前 ⋅ 0

上海云栖:金融政企行业的CDN最佳实践

摘要: 在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享,为上海的嘉宾介绍CDN的解决方案与技术服务体...

猫耳m ⋅ 41分钟前 ⋅ 0

docker 基本操作

docker介绍 Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具。其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖。Docker通过Docker容器,一个安全...

haoyuehong ⋅ 42分钟前 ⋅ 0

上海云栖:金融政企行业的CDN最佳实践

摘要: 在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享,为上海的嘉宾介绍CDN的解决方案与技术服务体...

阿里云云栖社区 ⋅ 44分钟前 ⋅ 0

安装与配置hadoop

一、CentOS7安装 java8,参考centos7.0 安装java1.8,tomcat 二、安装hadoop 版本V3.03 1、下载并解压hadoop # mkdir /usr/local/app# mkdir /usr/local/app/hadoop# cd /usr/local/app/had......

iturtle ⋅ 46分钟前 ⋅ 0

Idea设置Serializable自动生成

File --> Settings --> Editor --> Inspections ->Serialization issues,在该项下找到“Serializable class without 'serialVersionUID' ”并勾选...

Gmupload ⋅ 49分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部