• 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配置文件,按照类信息,进行映射。则为双向查询通道的建立。

  • 相关阅读:
    关于医学的一点想法
    我的ArcGis9.3 到Arcgis10.0 升级步骤
    最近一月的娱乐生活:看电影,玩游戏
    最近一月的娱乐生活:看电影,玩游戏
    5年技术学习历程的回顾
    5年技术学习历程的回顾
    网站开发的技术选型问题
    网站开发的技术选型问题
    学技术真累
    Java实现 LeetCode 200 岛屿数量
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/3924790.html
Copyright © 2020-2023  润新知