Hibernate详解(四)---->>关联关系映射(四)
Hibernate详解(四)---->>关联关系映射(四)
?6、单向多对多
?
??Course.java
?
package com.zxf.domain;import java.util.Set;/** 课程实体类 */public class Course {private Long id; //对象标识符(OID)private String name; //课程名private Double creditHours; //课时数private Set<Student> students; //选择了这门课程的学生的集合public Course(){} //无参数的构造方法//以下省略所有属性的getters和setters方法...}?Student.java
?
package com.zxf.domain;import java.util.Set;/** 学生实体类 */public class Student {private Long id; //对象标识符(OID)private String name; //姓名private String grade; //所在班级private Set<Course> courses; //所有所选课程的集合public Student(){} //无参数的构造方法//以下省略所有属性的getters和setters方法...}?
Course.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!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.zxf.domain.Course" table="course"><!-- 映射对象标识符 --><id name="id" column="id" type="long"><generator /></id><!-- 映射普通属性 --><property name="name"/><property name="creditHours" column="credit_hours"/><!-- 映射集合属性,指定连接表 --><set name="students" table="student_course" inverse="true"><!-- 用key元素指定本持久类在连接表中的外键字段名 --><key column="course_id" /><!-- 映射多对多关联类 --> <many-to-many column="student_id" /></set></class></hibernate-mapping>
?
Student.hbm.xml
?
<?xml version="1.0" encoding="UTF-8"?><!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.zxf.domain.Student" table="student"><!-- 映射对象标识符 --><id name="id" column="id" type="long"><generator /></id><!-- 映射普通属性 --><property name="name" /><property name="grade" /><!-- 映射集合属性,指定连接表 --><set name="courses" table="student_course"><!-- 用key元素指定本持久类在连接表中的外键字段名 --><key column="student_id" /><!-- 映射多对多关联类 --> <many-to-many column="course_id" /></set></class></hibernate-mapping>
?
配置文件:hibernate.cfg.xml
?
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 数据库方言设置 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property><!-- 数据库连接参数设置 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql:///hibernate</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123</property><!--实际操作数据库时是否显示SQL --><property name="hibernate.show_sql">true</property><property name="hibernate.format_sql">true</property><!--将数据库schema的DDL导出到数据库 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 以下定义实体类与数据库表的映像文件 --><mapping resource="com/zxf/domain/Student.hbm.xml" /><mapping resource="com/zxf/domain/Course.hbm.xml" /></session-factory></hibernate-configuration>
?
备注:
???? 在双向多对多关联映射中,最好要在某一端的集合属性映射上设置“inverse=true”,这样明确地告诉 Hibernate,让另一端负责连接表的更新。这样会有更好的性能。
???? 另外,从实际开发经验上来看,几乎所有的双向多对多关联都应该分解成两个双向的一对多关联。
?
?
?