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属性的主键值。
Hibernate关联关系配置(一对多、一对一和多对多)的更多相关文章
- Hibernate关联关系配置(一对多,一对一,多对多)
一对多 创建两个类 Manager(一这一端) Worker(多这一端) 即一个经理下有多个员工 package com.hibernate.n21; import java.util.HashS ...
- Hibernate 关联关系(一对多)
Hibernate 关联关系(一对多) 1. 什么是关联(association) 1.1 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性.例如: class B ...
- Hibernate笔记——关联关系配置(一对多、一对一和多对多)
原文:http://www.cnblogs.com/otomedaybreak/archive/2012/01/20/2327695.html ============================ ...
- hibernate关联关系(一对多)
什么是关联(association) 关联指的是类之间的引用关系.如果类A与类B关联,那么被引用的类B将被定义为类A的属性. 案例:如何建立客户和订单一对多双向关联 先不建立客户和订单的关联关系,定义 ...
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
- Hibernate中用注解配置一对多双向关联和多对一单向关联
Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解 ...
- 【转】hibernate映射(单向双向的一对多、多对一以及一对一、多对一)
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...
- Hibernate在关于一对多,多对一双向关联映射
[Hibernate]之关于一对多,多对一双向关联映射 因为一对多.和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name=&qu ...
- Hibernate的集合一对多与多对一
需求: 部门与员工 一个部门有多个员工; [一对多] 多个员工,属于一个部门 [多对一] 1.javaBean ——Dept.java package com.gqx.oneto ...
随机推荐
- 15款增强web体验的Javascript库
1. Pikaday: Standalone JavaScript Datepicker 这是一个令人耳目一新的JavaScript日期选择器 轻量轻(压缩和gzip后小于5KB) 没有依赖其它JS框 ...
- 安装和使用memcached
引用:http://www.czhphp.com/archives/252 如何将 memcached 融入到您的环境中? 在开始安装和使用 using memcached 之前,我们需要了解如何将 ...
- Linux下grep命令
2.grep命令 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本 ...
- <COM原理和应用>第七章的ITextObject代码是什么?
第7章中有如下的描述:-----------------------------------为了在程序中使用"Text.Object"文本对象,我们利用ClassWizard引 ...
- 在linux上使用交换文件扩展交换空间
想像一种情景,当我们的Linux系统用尽交换空间时,在这种情况下,我们想要使用swap分区扩展交换空间,但在某些情况下磁盘上已经没有可用的空闲分区了,致使我们不能把它扩大. 因此,在这种情况下,我们可 ...
- Jquery实现简单到计时功能(setTimeout,setInterval)
要实现一个标签或者按钮进行5秒到计时,非常简单,直接上代码: 倒计时:<span id="timeSpan1" style="color:red;font-size ...
- SER SERVER存储过程
Transact-SQL中的存储过程,非常类似于C#语言中的方法,可以重复调用.当存储过程执行一次后,可以将语句存储到缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. 一 ...
- Kernel Logestic Regression
一.把 soft margin svm 看做 L2 Regression 模型 先来一张图回顾一下之前都学了些什么: 之前我们是通过拉格朗日乘子法来进行soft Margin Svm的转化问题,现在换 ...
- __future__
[__future__] __future__用于改变python特性. 参考:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb4 ...
- 第三十三章 metrics(1) - graphite搭建 + whisper存储模式 + 高精度向低精度聚合方式 + 集成StatsD + 集成grafana
组件介绍: carbon:Carbon实际上是一系列守护进程,组成一个Graphite安装的存储后端.这些守护进程用一个名为Twisted的事件驱动网络引擎监听时间序列数据.Twisted框架让Car ...