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 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>
扫描二维码关注公众号,回复: 847106 查看本文章

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,让另一端负责连接表的更新。这样会有更好的性能。

     另外,从实际开发经验上来看,几乎所有的双向多对多关联都应该分解成两个双向的一对多关联。

 

猜你喜欢

转载自z-xiaofei168.iteye.com/blog/1026460