Hibernate中的映射关系(一对多)

☆樱花仙子☆ 提交于 2020-03-23 12:58:22

在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)
一对一关系:可以选择任意一方插入外键(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代码如下:

package com.atguigu.hibernate.one2one.foreign;

public class Department {

    private Integer deptId;
    private String deptName;
    
    private Manager mgr;

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public Manager getMgr() {
        return mgr;
    }

    public void setMgr(Manager mgr) {
        this.mgr = mgr;
    }
    
    
    
}

    manager的代码:

    

package com.atguigu.hibernate.one2one.foreign;

public class Manager {

    private Integer mgrId;
    private String mgrName;
    
    private Department dept;

    public Integer getMgrId() {
        return mgrId;
    }

    public void setMgrId(Integer mgrId) {
        this.mgrId = mgrId;
    }

    public String getMgrName() {
        return mgrName;
    }

    public void setMgrName(String mgrName) {
        this.mgrName = mgrName;
    }

    public Department getDept() {
        return dept;
    }

    public void setDept(Department dept) {
        this.dept = dept;
    }
    
    
    
}

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

<?xml version="1.0"?>
<!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.atguigu.hibernate.one2one.foreign.Department" table="DEPARTMENTS">

        <id name="deptId" type="java.lang.Integer">
            <column name="DEPT_ID" />
            <generator class="native" />
        </id>
        
        <property name="deptName" type="java.lang.String">
            <column name="DEPT_NAME" />
        </property>
        
        <!-- 使用 many-to-one 的方式来映射 1-1 关联关系,其实many-to-one 就是可以用来生成外键 -->
     <many-to-one name="mgr" class="com.atguigu.hibernate.one2one.foreign.Manager" column="MGR_ID" unique="true">
    </many-to-one>                     
    </class>
</hibernate-mapping>

 

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

  

<?xml version="1.0"?>
<!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.atguigu.hibernate.one2one.foreign.Manager" table="MANAGERS">
        
        <id name="mgrId" type="java.lang.Integer">
            <column name="MGR_ID" />
            <generator class="native" />
        </id>
        
        <property name="mgrName" type="java.lang.String">
            <column name="MGR_NAME" />
        </property>
        
        <!-- 映射 1-1 的关联关系: 在对应的数据表中已经有外键了, 当前持久化类使用 one-to-one 进行映射 -->
        <!-- 
            没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段
         -->
        <one-to-one name="dept" class="com.atguigu.hibernate.one2one.foreign.Department"       property-ref="mgr"></one-to-one>
        
    </class>
    
</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文件中配置:就是”多“那端添加一个外键

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.atguigu.hibernate.entities.n21">

    <class name="Order" table="ORDERS">

        <id name="orderId" type="java.lang.Integer">
            <column name="ORDER_ID" />
            <generator class="native" />
        </id>
        
        <property name="orderName" type="java.lang.String">
            <column name="ORDER_NAME" />
        </property>
        
        <!-- 
            映射多对一的关联关系。 使用 many-to-one 来映射多对一的关联关系 
            name: 多这一端关联的一那一端的属性的名字
            class: 一对应的类名
            column: 一那一端在多的一端对应的数据表中的外键的名字
        -->
        <many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one>

    </class>
</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>属性

 n1端: 
<set name="students" table="t_s_Connection">
            <key>
                <column name="T_ID" />
            </key>
            <many-to-many class="com.atguigu.hibernate.n2n.Student"  column="S_ID"/>
  </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端加上注解

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

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!