ssh学习:hibernate关系映射(5)

 hibernate中,多对多的关联关系

       诸多场景多会使用到多对多的关联关系。譬如:老师与学生之间

        在hibernate中,两表之间没有直接的关联,所要要借助第三方表来确认两表之间的关系。

 在持久化的实体对象当中,均使用集合类封装另一对象;

 在Xxx.hbm.xml中:

集合的标签中创建一个第三方的表两边的表必须一致;

<key></key>子表签来声明外键字段名;

使用<many-to-many></many-to-many>子标签来实现多对多的关联关系,class属性指的是另一类路径,column属性指的是另一表的外键字段名,需要一致。

以老师与学生之前关系为实例:

Javabean持久化对象:

student类

public class Student {
	private int id;
	private String name;
	private Set<Teacher> teachers;
	//省去get/set方法
}

 Teacher类

public class Teacher {
	private int id;
	private String name;
	private Set<Student> students;
	//省去get/set方法
}

student.hbm.xml配置:

<hibernate-mapping>
	<class name="com.usc.geowind.lilin.bean.manyToMany.Student"
		table="Student">
		<!-- type指明当前字段的类型 name对应实体中的属性名 -->
		<id type="integer" name="id">
			<!-- 提供ID自增的策略 native会根据数据库自行判断 -->
			<generator class="native" />
		</id>
		<property name="name" column="name"></property>
		<!-- 不能直接指定两者之间的多对多的关联关系,则需要借助第三方来确认关系 -->
		<!-- table是建立两表之前的关系的第三方表 -->
		<set name="teachers" table="ST">
			<!-- 外键 -->
			<key column="student_id"></key>
			<!-- 多对多的关联关系的标签 ,class指定的是类, column值是另外一方的外键字段名,需要一直 -->
			<many-to-many class="com.usc.geowind.lilin.bean.manyToMany.Teacher"
				column="teacher_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

teach.hbm.xml配置:

<hibernate-mapping>
	<class name="com.usc.geowind.lilin.bean.manyToMany.Teacher"
		table="Teacher">
		<!-- type指明当前字段的类型 name对应实体中的属性名 -->
		<id type="integer" name="id">
			<!-- 提供ID自增的策略 native会根据数据库自行判断 -->
			<generator class="native" />
		</id>
		<property name="name" column="name"></property>
		<!-- 不能直接指定两者之间的多对多的关联关系,则需要借助第三方来确认关系 -->
		<!-- table是建立两表之前的关系的第三方表 两边必须使用同一张第三方表 -->
		<set name="students" table="ST">
		<!-- 外键  -->
			<key column="teacher_id"></key>
			<!-- 多对多的关联关系的标签 ,class指定的是类, column值是另外一方的外键字段名,需要一致 -->
			<many-to-many class="com.usc.geowind.lilin.bean.manyToMany.Student"
				column="student_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

 2.使用第三方实体来实现多对多的关联关系:

在两对象之间使用集合的方式封装对方实体,而在第三方的实体中应用这两实体。

在三者之间的关联关系:两者实体与第三方实体之间均是一对多的关联关系,第三方实体与这两者之间均是多对一的关联关系。

还是以老师学生之间的多对多的关联关系,一STB为第三方实体为例:

Student:

public class Student2 {
		private int id;
		private String name;
		private Set<Teacher2> teachers;//另一对象
		//省去get/set方法
	}

Teacher:

public class Teacher2 {
		private int id;
		private String name;
		private Set<Student2> students;//另一对象
		//省去get/set方法
	}

STB:

public class STB {
		private int id;
		private Student2 student;
		private Teacher2 teacher;
		//省去get/set方法
	}

Xxx.hbm.xml配置:

Student.hbm.xml部分配置:

<set name="teachers" >
		<!-- 外键 -->
		<key column="student_id"></key>
		<!--与第三方实体是一对多关联关系 class 值指向第三方的实体 -->
		<one-to-many class="com.usc.geowind.lilin.bean.manyToMany.STB"/>
	</set>

  

Teacher.hbm.xml中部分配置:

<set name="students">
		<!-- 外键 -->
		<key column="teacher_id"></key>
		<!-- 与第三方实体是一对多关联关系 class 值指向第三方的实体 -->
		<one-to-many class="com.usc.geowind.lilin.bean.manyToMany.STB" />
	</set>

STB.hbm.xml:

<hibernate-mapping>
		<class name="com.usc.geowind.lilin.bean.manyToMany.STB"
			table="STB">
			<!-- type指明当前字段的类型 name对应实体中的属性名 -->
			<id type="integer" name="id">
				<!-- 提供ID自增的策略 native会根据数据库自行判断 -->
				<generator class="native" />
			</id>
			<!--与两者之间均是多对一关联关系-->
			<many-to-one name="student" column="student_id"></many-to-one>
			<many-to-one name="teacher" column="teacher_id"></many-to-one>
		</class>
	</hibernate-mapping>

相关推荐