一.什么是hibernate的关联关系
hibernate框架是与数据库打交道的,而数据库是存储数据的,有些数据之间有些内在联系,hibernate将对象之间通过某种方式联系起来,世界万物都有联系的,如用户和身份证,你创建了一个用户的一个数据库表,而每个用户要有身份证,所以你还要创建一个装身份证的一个数据库表,但你怎么把它们联系起来,或者说怎么分清楚哪个用户是哪个身份证,这就是我们要学的hibernate的关联关系。
二.hibernate的关联关系内容
我们知道了它大概是干什么的了,现在来了解一下hibernate框架关联关系的具体内容。
在数据库中存在四种关联关系映射,分别是一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)和多对多(many-to-many),其中日常开发中比较常用的是一对多和多对一的映射。但这种关系里面又分有单向和双向关系,又分为有主键和外键的关系,下面我讲的关系都是单向和主键之间的关系。
1.单向一对一主键关系
什么是一对一关系呢?刚开始举得例子就是一对一的关系,一个用户只拥有一个身份证,而一个身份证也只对应一个用户,并不存在一个用户拥有多份身份证,下面我讲单向的,通过添加主键来体现关系。
在java里:
public class Person {
private int id;
private String name;
private IdCard idCard;//体现一对一的关系。保存映射类的实例对象
}
在配置文件中:
<hibernate-mapping>
<class name="com.Person" table="person">
<id name="id" column="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<!-- 一些常规属性 -->
<property name="name"></property>
<one-to-one name="idCard" constrained="true"></one-to-one>//这里体现一对一关系
</class>
IdCard java里和平常配置数据库一样
测试代码
IdCard idCard = new IdCard();
idCard.setCardNo("11111111");
Person person = new Person();
person.setName("qqq");
person.setIdCard(idCard);
session.save(idCard);
session.save(person);
但这一般都是设成双向的,我们可以通过用户找到身份证,应该通过身份证也要找到用户才对。
2.一对多关系
什么叫做一对多关系?举个例子,就好比班级和学生,站在班级的角度来看,一个班级包含多个学生,那么班级和学生的关系就是一对多的关系。接下来我还是通过添加主键来体现它们的一对多关系。
首先创建学生类Student,里面包含了学生的id、姓名和性别信息。
private int sid;
private String sname;
private String sex;
然后创建班级类Grade,因为是单向一对多的关联,所以需要在Grade中定义一个学生类的集合。
private int gid;
private String gname;
private String gdesc;
private Set<Student> students = new HashSet<Student>();
//这个体现一个班级对应许多学生
接下来是它们对应的xxx.hbm.xml文件,其它的内容配置都差不多,我只展示一些重要的
<one-to-many class="com.Student" /> //在班级里面的配置文件设置,体现一对多的关系
3.多对一关系
其实多对一和一对多差不多,你说班级和学生是多对一关系,反过来学生和班级不就是一对多关系,不就和上面差不多了吗?只是配置文件修改下就行了,我也不多展示代码了。
4.多对多关系
多对多可能见的多,比如老师和学生,学生知道老师是谁,有哪几个,同样,老师也应该知道他教了那些学生,所以是多对多的关系。下面还是写单向的主键关联。
创建一个teacher类
private int id;
private String name;
private Set<student> students = new HashSet<student>();
//set get方法省略
在创建一个student类
private int id;
private String name;
//如果是双向的还要有teacher的集合
//set get方法省略
teacher的xml配置
<class name="com.xxx.Teacher">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" table="t_s">table定义中间表的表名
<key column="teacher_id"></key>
<many-to-many class="com.xxx.Student" column="student_id"/>
</set>
</class>
student配置就只要配置创建student表的内容就行了。双向的就需要在student里配置many-to-many,但中间表的名字得一样。