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

原文地址:https://www.cnblogs.com/shangxiaofei/p/3924790.html