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>
学生的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>
二多对多配置
【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>
课程的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>
三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配置文件,按照类信息,进行映射。则为双向查询通道的建立。