zoukankan      html  css  js  c++  java
  • 【Hibernate】--关联关系映射:一对多和多对一

        之前已经对一对一的关联映射作了介绍,在日常开发中,我们还经常遇到一对多和多对一的情况。其实一对多和多对一这两种情况可以看做是一种映射,只是看待的角度不同。

        

       一对多/多对一分为两种关联关系:单向关联和双向关联

           单向关联:在一/多的一端进行配置

           双向关联:两端都进行配置。


      下面用实例来介绍这两种关系:班级(Class)与学生(Student)的关系

        1、一对多:一个班级对应多个学生(使用双向向一对多)

          实体类:

            Classes.java          

    public class Classes {
      private int id;
      private String name;
      //在classes中引用Student,使用set定义
      private Set student;
    }
           Student.java         

    public class Student {
      private int id;
      private String name;
      //加入Classes
      private Classes classes;
    }
          映射文件的配置如下:

           Classes.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>
      <class name="com.tgb.hibernate.Classes" table="t_classes_one2many">
        <id name="id">
          <generator class="native"/>
        </id>
        <property name="name" />
        <!-- 映射student实体集合 -->
        <!-- 使用inverse=true,将维护数据的功能交给student端 -->
        <set name="student" inverse="true">
        <!-- 在student中设置外键 -->
          <key column="classId"/>
          <!-- 指向student实体类 -->
          <one-to-many class="com.tgb.hibernate.Student"/>
        </set>
      </class>
    </hibernate-mapping>
           Student.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>
      <class name="com.tgb.hibernate.Student" table="t_student_one2many">
        <id name="id">
          <generator class="native"/>
        </id>
        <property name="name" />
        <!-- 指向classes实体,name值与student中的引用的classes名称对映 -->
        <many-to-one  name="classes" column="classId"></many-to-one>
      </class>
    </hibernate-mapping>
         说明:一对多关联,在“一”的一端Clasess为“多”的一端Student添加一个外主键,使用set标签进行设置。其中key表示设置外键,one-to-many表示在“一”端引入“多”端,值是“多”的实体类完整路径。注意inverse的使用,默认为false,表示在该端(此处为“一”端)可以维护关系,一般情况下,我们在“多”端维护关系,所以设置为true,表示在对端即“多”端维护关系。


        2、多对一:多个学生(Student)对映一个班级(Classes)   (使用单向关联)

          映射文件

            Student.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>
      <class name="com.tgb.hibernate.Student" table="t_student_many2one">
        <id name="id">
          <generator class="native"/>
        </id>
        <property name="name" />
        
        <many-to-one  name="classes" column="classId" cascade="save-update"/>
      </class>
    </hibernate-mapping>
           Classes.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>
      <class name="com.tgb.hibernate.Classes" table="t_classes_many2one">
        <id name="id">
          <generator class="native"/>
        </id>
        <property name="name" />
       
      </class>
    </hibernate-mapping>
        说明:多对一关联,在“多”端加入“一”端的外键,使用many-to-one标签。如果要使用双向关联,则在“一”端Classes中使用one-to-many标签进行设置。注意在“多”端cascade的使用,cascade表示关联操作,配置在Classes中,表示向学生中插入、更新时,自动更新Classes中对应的信息。


        多对一及一对多关联映射的区别(单向):
           不管多对一还是一对多,都是在"多"的一端添加一个外键指向"一"的一端,只不过是多对一是在多的一端为其自己添外键,而一对多则是在一的一端为多的一端添加外主键。


  • 相关阅读:
    开源项目
    [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像
    Android 布局 中实现适应屏幕大小及组件滚动
    EF 错误记录
    EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题
    IE 报表缩放后页面破版
    VS 2017 引入nuget 问题
    SSRS 报表显示页面 asp net session丢失或者找不到 asp net session has expired or could not be found()
    log4net 配置
    网站
  • 原文地址:https://www.cnblogs.com/victor-grace/p/7253657.html
Copyright © 2011-2022 走看看