在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)
一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique='true'])
一对多关系:在多的一端插入一端的主键为外键(one-to-many<--->many-to-one)
多对多关系:新建一个表,选择两个表的主键为表的两个外键(many-to-many<-->many-to-many>)

关系配置步骤:

  ①:分析1端和n端

  ②:在1端插入n端的集合属性

  ③:在n端插入一端的对象属性

  ④:注明关系在那一段维护

  基于xml文件格式配置
I单向一对一(以department和manager为例)

  配置步骤:

  ①:分析1端和n端(如果是一对一关系的时候,可以选择任意一方为N端,这里指定department为n端)

  ②:在1端插入n端的集合属性(因为是一对一,所以不可以使集合对象属性,只能使用对象属性->private Department department)

  ③:在n端插入一端的对象属性->private Manager manager

  ④:注明关系在那一段维护:一般选择N端来维护关系  《使用many-to-one[unique='true']》

  步骤:1在一对一关联的持久化类中互相添加对方对象属性,
       例如在department中添加private manager manager属性:

       department代码如下:

  1. package com.atguigu.hibernate.one2one.foreign;
  2.  
  3. public class Department {
  4.  
  5. private Integer deptId;
  6. private String deptName;
  7.  
  8. private Manager mgr;
  9.  
  10. public Integer getDeptId() {
  11. return deptId;
  12. }
  13.  
  14. public void setDeptId(Integer deptId) {
  15. this.deptId = deptId;
  16. }
  17.  
  18. public String getDeptName() {
  19. return deptName;
  20. }
  21.  
  22. public void setDeptName(String deptName) {
  23. this.deptName = deptName;
  24. }
  25.  
  26. public Manager getMgr() {
  27. return mgr;
  28. }
  29.  
  30. public void setMgr(Manager mgr) {
  31. this.mgr = mgr;
  32. }
  33.  
  34. }

    manager的代码:

    

  1. package com.atguigu.hibernate.one2one.foreign;
  2.  
  3. public class Manager {
  4.  
  5. private Integer mgrId;
  6. private String mgrName;
  7.  
  8. private Department dept;
  9.  
  10. public Integer getMgrId() {
  11. return mgrId;
  12. }
  13.  
  14. public void setMgrId(Integer mgrId) {
  15. this.mgrId = mgrId;
  16. }
  17.  
  18. public String getMgrName() {
  19. return mgrName;
  20. }
  21.  
  22. public void setMgrName(String mgrName) {
  23. this.mgrName = mgrName;
  24. }
  25.  
  26. public Department getDept() {
  27. return dept;
  28. }
  29.  
  30. public void setDept(Department dept) {
  31. this.dept = dept;
  32. }
  33.  
  34. }

    2对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素且增加unique=“true” 属性来表示为1-1关联

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping>
  5.  
  6. <class name="com.atguigu.hibernate.one2one.foreign.Department" table="DEPARTMENTS">
  7.  
  8. <id name="deptId" type="java.lang.Integer">
  9. <column name="DEPT_ID" />
  10. <generator class="native" />
  11. </id>
  12.  
  13. <property name="deptName" type="java.lang.String">
  14. <column name="DEPT_NAME" />
  15. </property>
  16.  
  17. <!-- 使用 many-to-one 的方式来映射 1-1 关联关系,其实many-to-one 就是可以用来生成外键 -->
  18. <many-to-one name="mgr" class="com.atguigu.hibernate.one2one.foreign.Manager" column="MGR_ID" unique="true">
  1.     </many-to-one>
  2. </class>
  3. </hibernate-mapping>

  另一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段(就是要指定外键是哪一个,记得是使用Java的属性名,不是使用Sql的列名)

  

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4.  
  5. <hibernate-mapping>
  6.  
  7. <class name="com.atguigu.hibernate.one2one.foreign.Manager" table="MANAGERS">
  8.  
  9. <id name="mgrId" type="java.lang.Integer">
  10. <column name="MGR_ID" />
  11. <generator class="native" />
  12. </id>
  13.  
  14. <property name="mgrName" type="java.lang.String">
  15. <column name="MGR_NAME" />
  16. </property>
  17.  
  18. <!-- 映射 1-1 的关联关系: 在对应的数据表中已经有外键了, 当前持久化类使用 one-to-one 进行映射 -->
  19. <!--
  20. 没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段
  21. -->
  22. <one-to-one name="dept" class="com.atguigu.hibernate.one2one.foreign.Department"
          property-ref="mgr"></one-to-one>
  23.  
  24. </class>
  25.  
  26. </hibernate-mapping>

对于一对一关联映射,记得千万不要两张表都设置外键,这样会引起逻辑错误的

2下面就详细说一下在Hibernate中怎样映射一对多的关系

根据文章开头的介绍的配置步骤来分析(以order和customer为例子)
  1分析那一个是N端(order)
  2在一端插入n端的集合属性 -->private set<order> orders
  3在N端插入一端的对象属性-->private Customer customer
  4在N端指定依赖维护关系:在n端的hbm.xml文件中插入
      --<many-to-one name="N端插入一端时的对象属性名" class="对象属性的对象全类名" column="外键名"></many-to-one>

  就需要通过那就用到.hbm.xml文件的<many-to-one>标签了

  在order.hbm.xml文件中配置:就是”多“那端添加一个外键

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4.  
  5. <hibernate-mapping package="com.atguigu.hibernate.entities.n21">
  6.  
  7. <class name="Order" table="ORDERS">
  8.  
  9. <id name="orderId" type="java.lang.Integer">
  10. <column name="ORDER_ID" />
  11. <generator class="native" />
  12. </id>
  13.  
  14. <property name="orderName" type="java.lang.String">
  15. <column name="ORDER_NAME" />
  16. </property>
  17.  
  18. <!--
  19. 映射多对一的关联关系。 使用 many-to-one 来映射多对一的关联关系
  20. name: 多这一端关联的一那一端的属性的名字
  21. class: 一对应的类名
  22. column: 一那一端在多的一端对应的数据表中的外键的名字
  23. -->
  24. <many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one>
  25.  
  26. </class>
  27. </hibernate-mapping>

单向多对多:(以teacher和student为例)

根据文章开头的介绍的配置步骤来分析
  1分析那一个是N端,---->两者都是N端,所以为n1(teacher)和n2(student)端
  2在n1端插入n2端的集合对象属性 -->private set<student> students
  3在n2端插入n1端的集合对象属性-->private set<teacher> teachers
  4在N端指定依赖关系:因为都是N端,所以多要在n1和n2端指定<set>属性和<many-to-many>属性

  1.  n1端: 
  1. <set name="students" table="t_s_Connection">
  2. <key>
  3. <column name="T_ID" />
  4. </key>
  5. <many-to-many class="com.atguigu.hibernate.n2n.Student" column="S_ID"/>
  6. </set>
    n2端:

<set name="teachers" table="t_s_Connection">
  <key>
      <column name="S_ID"></column>
  </key>
  <many-to-many class="com.atguigu.hibernate.n2n.Teacher" column="T_ID" ></many-to-many>
</set>

    基于注解方式配置

关系配置步骤:

  ①:分析1端和n端

  ②:在1端插入n端的集合属性

  ③:在n端插入一端的对象属性

  ④:在被维护的一端插入维护端的属性名
  ⑤:注明关系在那一段维护

1一对一关系
  根据关系配置步骤:(以department和manager为例子)

  ①:分析1端和n端---因为是一对一关系,所以没有N断,所以指定任意一个为N端,我这里指定department为N端

  ②:在1端插入n端的集合对象属性---(因为是一对一,所以不是集合)--->private deparment deparment

  ③:在n端插入一端的对象属性---->private manager manager

  ④:在被维护的一端插入维护端的属性名@OneToOne(mappedBy="person")
  注明关系在那一段维护:-->一般选择自己指定的N端维护,所以在department端加上注解

  1.    @OneToOne  --->  OnetoOne指定了一对一的关联关系,一对一中随便指定一方来维护映射关系,这里选择IDCard来进行维护
  2. @JoinColumn(name="pid")

 

Hibernate中的映射关系(一对多)的更多相关文章

  1. hibernate中一对一映射

    一.hibernate中一对一映射有两种 1 主键方式,一张表的主键是通过另一张表的主键生成的 2 外键方式,一张表添加外键引用另一张表的主键,并添加唯一unique约束 二.下面进行简单例子,用户和 ...

  2. hibernate中的映射

    hibernate中的映射是指Java类和数据库表中的属性来进行关联,然后通过类来操作数据库中,这就是简单的映射.

  3. Hibernate的关联映射关系

    一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...

  4. Hibernate学习之映射关系

    一.Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1.“多”端实体加入引用“一”端实体的变量及g ...

  5. Hibernate框架--关联映射,一对多,多对多 inverse cascade

    回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...

  6. hibernate笔记--继承映射关系的三种实现方式

    单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...

  7. 关于hibernate中多对多关系

    关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...

  8. hibernate 中多对多关系对象集合的保存

    多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...

  9. 【转】hibernate中的映射文件xxx.hbm.xml详解总结

    一.Hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁 二,Hibernate映射文件主要内容:     (1).映射内容的定义: Hibern ...

随机推荐

  1. 从零开始,跟我一起做jblog项目(一)引言

    从零开始,跟我一起做jblog项目(一)引言 想做一个java版的blog,源自一个很久之前的想法 当时刚学习JAVA的web编程 想买自己的域名,自己的VPS,安装自己的WEB服务 用google ...

  2. UCOS2系统内核讲述(四)_创建任务

    Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 UCOS2系统内 ...

  3. Hive及HBase数据迁移

    一. Hive数据迁移 场景:两个Hadoop平台集群之间Hive表迁移. 基本思路:Hive表元数据和文件数据export到HDFS文件,通过Distcp将HDFS迁移到另一个集群的HDFS文件,再 ...

  4. yum whatprovides host 根据命令查找包

    [root@Cobbler ~]# yum whatprovides host Loaded plugins: fastestmirror Loading mirror speeds from cac ...

  5. 微信小程序 - Util工具类

    /utils/utils.js   已经扩展到App对象中,Page方法中直接使用  app.util.method(...) 调用. 1. 扩展String.replaceAll JS默认值提供re ...

  6. jq 按回车键 登陆

    $("body").keydown(function(e) {             if (event.which == "13") {//keyCode= ...

  7. javascript父、子页面交互小结

    帧用来存放子页面,既可以是iframe,又可以是frameset.window对象是全局对象,页面上的一切函数和对象都在它的作用域里.     1.parent代表父窗口.如果父窗口又存在若干层嵌套, ...

  8. google cloud之停止任务

    1.点击侧边栏:ML Engine -> Jobs 2.选择对应的任务,点击stop

  9. linux -- 查看ip,路由,dns

    查看ip地址:ifconfig 查看gateway:route 查看dns:nm-tool

  10. 开源 java CMS - FreeCMS2.2 建站向导

    项目地址:http://www.freeteam.cn/ 建站向导 为了方便用户创建网站,系统提供了建站向导功能. 从左側管理菜单点击建站向导进入. 第一步:创建网站 能够直接设置所属的父网站.填写相 ...