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 class="native" /> </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" class="com.zxf.domain.Student" /> </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 class="native" /> </id> <!-- 映射普通属性 --> <property name="name" /> <property name="grade" /> <!-- 映射集合属性,指定连接表 --> <set name="courses" table="student_course"> <!-- 用key元素指定本持久类在连接表中的外键字段名 --> <key column="student_id" /> <!-- 映射多对多关联类 --> <many-to-many column="course_id" class="com.zxf.domain.Course" /> </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,让另一端负责连接表的更新。这样会有更好的性能。
另外,从实际开发经验上来看,几乎所有的双向多对多关联都应该分解成两个双向的一对多关联。