zoukankan      html  css  js  c++  java
  • hibernate映射xml文件配置之一对多,多对多

    一对多配置

    【1】班级和学生模型

          --->班级可容纳多个学生

          --->学生只能属于一个班级

    【2】一对多配置中的关系维护(inverse)

          --->一端放弃关系的维护

          --->多端进行关系维护。

      inverse默认值false,表示不放弃关系的维护。

      inverse="true"配置在那一端,表示那一端放弃关系的维护(交由hibernate内部进行维护),由另一端进行关系维护。

    班级的ClassRoom.hbm.xml的配置文件

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping 
     6     package="com.bjsxt.shangxiaofei.po"><!-- 实体类包名,如果此处不加package属性,下面所有的class要写全路径:报名+类名 -->
     7 
     8     <class name="ClassRoom" table="t_classroom">
     9         
    10         
    11         <!-- 主键递增 -->
    12         <id name="id" column="id">
    13             <generator class="native"></generator>
    14         </id>
    15         
    16         <!-- 班级名字 -->
    17         <property name="name" column="name"></property>
    18         
    19         <!-- 班级的学生,班级对学生  一对多的关系   一端放弃关系的维护,多端进行维护,在set中inverse="true"-->
    20         <set name="students" inverse="true">
    21             <!-- 将班级的主键id在学生表中生成外键 -->
    22             <key column="class_id"></key>
    23             <one-to-many class="Student" />
    24         </set>
    25         
    26         
    27     </class>
    28     
    29 </hibernate-mapping>
    View Code

    学生的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 
        package="com.bjsxt.shangxiaofei.po"><!-- 实体类包名 -->
    
        <class name="Student" table="t_student">
            
            
            <!-- 主键递增 -->
            <id name="id" column="id">
                <generator class="native"></generator>
            </id>
            
            <!-- 学生名字 -->
            <property name="name" column="name"></property>
            <!-- 学生性别 -->
            <property name="sex" column="sex"></property>
            
            <!-- 学生的班级  学生对班级  多对一关系-->
            <many-to-one name="classRoom" class="ClassRoom">
                <!-- 学生表中的外键,是班级表的主键,此处与另一端指定的外键名必须相同 -->
                <column name="class_id"></column>
            </many-to-one>
            
        </class>
        
    </hibernate-mapping>
    View Code

    二多对多配置

    【1】学生和课程多对多模型

       --->一个学生可以选择多门课程

       --->一门课程可以拥有多个学生

    【2】多对多配置中的关系维护(inverse)

         --->那一端内容修改的频繁,则放弃关系维护(学生放弃关系维护)

       --->那一端相对修改较少,那一端进行关系维护

    学生的Student.hbm.xml的配置文件

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping 
     6     package="com.bjsxt.shangxiaofei.po"><!-- 实体类包名 -->
     7 
     8     <class name="Student" table="t_student">
     9         
    10         
    11         <!-- 主键递增 -->
    12         <id name="id" column="id">
    13             <generator class="native"></generator>
    14         </id>
    15         
    16         <!-- 学生名字 -->
    17         <property name="name" column="name"></property>
    18         <!-- 学生性别 -->
    19         <property name="sex" column="sex"></property>
    20         
    21         <!-- 学生课程,学生对课程 多对多关系  table是中间表的名字   学生信息修改频繁,放弃关系的维护-->
    22         <set name="courses" table="student_course" inverse="true">
    23             <!-- 本表在中间表中的外键 -->
    24             <key column="student_id"></key>
    25             <!-- 本表与对应表的映射关系,对应表在中间表的外键 -->
    26             <many-to-many class="Course" column="course_id"></many-to-many>
    27         </set>
    28             
    29     </class>
    30     
    31 </hibernate-mapping>
    View Code

    课程的Course.hbm.xml的配置文件

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping 
     6     package="com.bjsxt.shangxiaofei.po"><!-- 实体类包名 -->
     7 
     8     <class name="Course" table="t_course">
     9         
    10         
    11         <!-- 主键递增 -->
    12         <id name="id" column="id">
    13             <generator class="native"></generator>
    14         </id>
    15         
    16         <!-- 课程的名字 -->
    17         <property name="name" column="name"></property>
    18         
    19         <!-- 课程拥有的学生 课程对学生 多对多的关系 table表示中间表的名字 -->
    20         <set name="students" table="student_course">
    21             <!-- 本表在中间表的外键 -->
    22             <key column="course_id"></key>
    23             <!-- 本表与对应表的映射关系,column表示对应表在中间表的外键名字 -->
    24             <many-to-many class="Student" column="student_id"></many-to-many>
    25         </set>
    26     </class>
    27     
    28 </hibernate-mapping>
    View Code

    三hibernate的查询通道的建立:

     [1]单向关联

        --->只能通过A端查询到B端。利用面向对象的思想,也就是hql语句。

               --->如果想从B端查询到A端,就需要写原始sql语句。

      例子:学生和班级模型 student ---classRoom

            单向:在student类中建立classRoom的属性。而在ClassRoom的类中,不要建立Set<Student>的集合类。

            映射xml文件按照类信息配置,也就是说只有一端有配置。则为单向查询通道的建立。

     [2]双向关联

        --->通过A端可以查询到B端,通过B端也可以查询到A端

               --->双向查询,不需要写原始sql语句,只需要按着面向对象的思想操作数据库。hql

         例子:学生班级模型  student-classRoom

         在Student类中建立ClassRoom的属性。在ClassRoom的类中建立Set<Student> 的集合属性。然后xml配置文件,按照类信息,进行映射。则为双向查询通道的建立。

  • 相关阅读:
    centos7 hbase 搭建笔记
    【转】python 2.6.6升级到python 2.7.x版本的方法
    centos7 sqoop 1 搭建笔记
    centos7 hive + 远程mysql 搭建笔记
    docker 批量操作容器
    centos7 hdfs yarn spark 搭建笔记
    【转】mysql查看表空间占用情况
    【转】Centos 7 修改主机名hostname
    jQuery选择
    jQuery检查复选框是否被选
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/3924790.html
Copyright © 2011-2022 走看看