zoukankan      html  css  js  c++  java
  • Hibernate中的映射关系(一对多)

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

     

  • 相关阅读:
    面向对象--进阶
    组合补充--类的特殊成员
    面向对象--类,嵌套
    面向对象(初级)
    模块--包
    异常处理
    模块--3
    模块--2
    django环境处理
    Django使用中间件通过CORS方式解决跨域
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4011823.html
Copyright © 2011-2022 走看看