关联关系映射,是对象映射关系中相对复杂的一种,但也是用处最多的一种,因为数据中的表不可能都是单独存在,彼此之间必定存在千丝万缕的联系,这也是关系型数据库的特征所在。同样关联关系的映射,也是对象关系映射中的难点,重点,仔细揣摩,也还是很容易理解掌握的。
上篇博客,从最简单的一对一映射开始最开端。在关系映射里面,使用频率最高的就是,一对多和多对一的关系。本文,介绍简单的一对多和多对一关系的实现。
一对多关系的建立:
(1)建立实体类
public class Classes { private int id; private String name; private Set students; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getStudents() { return students; } public void setStudents(Set students) { this.students = students; } } public class Student { private int id; private String name; private Classes classes; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Classes getClasses() { return classes; } public void setClasses(Classes classes) { this.classes = classes; } }
(2)建立配置文件:
<class name="com.zs.hibernate.Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students" inverse="true"> <key column="classesid"/> <one-to-many class="com.zs.hibernate.Student"/> </set> </class> <class name="com.zs.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="classes" column="classesid"/> </class>
多对一关系:
(1) 建立实体(代码略)
(2) 配置文件
<class name="com.zs.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id"/> <many-to-many class="com.zs.hibernate.Role" column="role_id" /> </set> </class> <class name="com.zs.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class>
(3) 生成表关系
其中多对一关系,同一对一映射的外键关联基本上差不多,只是一对一映射,又加入唯一性的约束。
之所以两种关系写在一起,由于两种关系生成的表关系相同,在物理模型方面,维护方式相同。但是从对象方面考虑,一对多关系,是利用set储存多个一的对象,维护的重点在与多的一端,而多对一维护的重点在一的一端