• 【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中对应的信息。


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


  • 相关阅读:
    解决maven update project 后项目jdk变成1.5的问题
    applicationContext-common.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
    SQL0668N 不允许对表"xxx"执行操作,原因码为 "1"
    maven下的jar项目打包的方法
    spring security 4.2后出现CouldnotverifytheprovidedCSRFtokenbecauseyoursessionwasnotfound
    maven-javadoc-plugin 出现错误Unsupported major.minor version 51.0
    通过 Spring Security配置 解决X-Frame-Options deny 造成的页面空白 iframe调用问题
    yaml模块
    centos 下 yum安装python3
    Python 之ConfigParser模块
  • 原文地址:https://www.cnblogs.com/victor-grace/p/7253657.html
Copyright © 2020-2023  润新知