第一种关联关系:一对多(多对一)
“一对多”是最普遍的映射关系,简单来讲就如消费者与订单的关系。
一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多。
多对一:从订单的角度来说多个订单可以对应一个消费者,即为多对一。

一对多关系在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>

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

  一对一外键关联,其实可以看做是一对多的一种特殊形式,多方退化成一。多方退化成一只需要在标签中设置”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关联关系配置(一对多、一对一和多对多)相关推荐

  1. Hibernate关联关系配置(一对多,一对一,多对多)

    一对多 创建两个类  Manager(一这一端) Worker(多这一端)  即一个经理下有多个员工 package com.hibernate.n21;import java.util.HashSe ...

  2. hibernate映射(单向双向的一对多、多对一以及一对一、多对一(转)

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 也就是说一对多和多对一的映射策略是一样的,只是站 ...

  3. Hibernate 关联关系 之 多对多

    Hibernate 关联关系 之 多对多 Hibernate 多对多关联关系 数据库表 entity 实体类 Book Category TreeNode xml 配置 book.hbm.xml ca ...

  4. (转)Hibernate关联映射——一对多(多对一)

    http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射--一对多(多对一) 我们以客户(Customer)与 ...

  5. 总结一下数据库的 一对多、多对一、一对一、多对多 关系

    数据库的 一对多.多对一.一对一.多对多 关系 关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系: 一对多:从球队角度来说一个球队拥有多个球员 即为一对多 多对一:从球员角 ...

  6. SQL的一对多,多对一,一对一,多对多什么意思?

    SQL的一对多,多对一,一对一,多对多什么意思? 1.一对多:比如说一个班级有很多学生,可是这个班级只有一个班主任.在这个班级中随便找一个人,就会知道他们的班主任是谁:知道了这个班主任就会知道有哪几个 ...

  7. Hibernate 注解配置

    近几年来,注解方式的配置因其简单易用的特点深受广大程序员的青睐,Hibernate也添加了对注解配置的支持.接下来我们就以论坛系统为例来讲解基于注解配置实体类和表的映射关系,以及实体和实体的关联关系. ...

  8. Hibernate关联关系映射实例速查

    Hibernate关联关系映射实例速查 Hibernate的映射关系很多,也比较复杂,也很容易忘记.这个基本上占据了Hibernate学习的七成时间.熟悉这些映射模型,需要大量的实践才能掌握.下面是我 ...

  9. Hibernate 中配置属性详解(hibernate.properties)

    转自:https://blog.csdn.net/shudaqi2010/article/details/70324843 Hibernate能在各种不同环境下工作而设计的, 因此存在着大量的配置参数 ...

最新文章

  1. linux下oracle数据库服务和监听的启动停止
  2. pytorch系列 ---5以 linear_regression为例讲解神经网络实现基本步骤以及解读nn.Linear函数
  3. k8s 查看pod流量_Kubernetes K8S之Pod生命周期与探针检测
  4. JavaScript 条件语句和循环语句
  5. 箭头函数写法_箭头函数
  6. Android百度地图修改定位时间间隔
  7. 解决Ubuntu系统上网速度慢的问题
  8. html语言span标签,html 中span标签里面都能放那些标签??
  9. javaEE自驾游旅游景点管理系统ssm
  10. Android手机应用CTA认证自测
  11. 用CRM的思想定制客户经理作业平台
  12. 【图文并茂】六十多个 vscode 插件,助你打造最强编辑器
  13. 命令模式,升级版的灭霸响指
  14. 「GitLab篇」如何用Git平台账号登录建木CI
  15. Redis 的 Sentinel 系统
  16. Windows 查看文件占用
  17. 成功并不难,在于少犯错!
  18. ExeCryptor加壳的问题
  19. 阿里云田丰:软件的SAAS化和SAAS软件的AI化是行业的重要趋势
  20. HTML块元素和行内块元素

热门文章

  1. 牛客题霸 [ 旋转数组] C++题解/答案
  2. test2 3-16 2021 模拟赛two
  3. 51nod1821-最优集合【贪心】
  4. P5341-[TJOI2019]甲苯先生和大中锋的字符串【SAM】
  5. P4284-[SHOI2014]概率充电器【树形dp,换根法,数学期望】
  6. P3899-[湖南集训]谈笑风生【主席树】
  7. 【2018.3.24】模拟赛之二-ssl2546 求和【贪心】
  8. codeforces1494 D. Dogeforces(构造)
  9. 牛客练习赛 65 (待补E-网络流)
  10. 【AC自动机】屏蔽词删除(ybtoj AC自动机-4)