Hibernate关联关系的精髓总结
一 多对一 单向关联 (以Employee和Dempartment为例)
1.多对一 :一个部门可以有多个员工,一个员工只属于一个部门
2.多对一的分析
一个部门有多个员工,所以在建外键的时候选择的是在Employee的一方,即是多的一方,因为Hibernate的执行过程是先通过Configure去读取配置文件中的信息和数据库建立连接,根据配置文件的信息去找所对应的映射文件,映射文件的作用是把所建立的实体类映射为一个二维表,在映射成二维表的时候在Employee的映射中即在Employee.hbm.xml中设置一个员工所对应的部门,所使用的标签为:
<many-to-one name="depart" column="depart_id" not-null="true" />
说明:标签简明思义为多对一,其中的属性name是在Employee中设置的Department类的对象,column是在数据库中外键的名字,not-null是不允许为空
在建立实体对象的时候,一的那一方(Dempartment),创建id,name等其他的普通属性,而在建立多的那一方的实体对象的时候,因为是多对一,所以要增加一个属性,为:
Dempartment depart;
二 一对多 单项关联 (以Dempartment和Employee为例)
1.一对多其实和多对一样的,只是所站的位置不同,所以会有不同的看法,如果是多对一,那么是一个部门有多个员工,因为是一对多,所以要在一的那一方,即是Dempartment中设置属性的时候要设置Employee对象,而Employee是多个,所以用集合存储起来,在建立实体类的时候,只需在Dempartment类中多写一个:
Set<Employee> emps;
属性即可。
2.在写配置文件的时候,在Demparment.hbm.xml中只需写一个set标签即可:
<set name="emps">
<!-- 根据外键的值查询,而不是查询所有的记录-->
<key column="depart_id"/>
<!-- 告诉Hibernate emps是集合属性,是一对多的关联 -->
<one-to-many class="Employee" />
</set>
注:不管是多对一还是一对多,实体类所映射的数据库表中的结构是一样的,因为他们就是相同的,就是所站的角度不同而已
三 双向的多对一或一对多
双向的其实从字面的意思可以看出可以从多的一方查找一的一方,也可以从一的一方查找到多的一方,所对应的实体类是把前边两个的结合,映射文件也是
四 一对一(以Person和IdCard为例)
1.一对一是一个人只有一个身份证,而一个身份证只属于一个人,有了前边的经验,一对一的实体类的创建也就是在Person的类中多一个IdCard idCard;属性,在IdCard的类中多一个Person person;属性。
2.在Person.hbm.xml映射文件中是:
<one-to-one name="idCard"></one-to-one>
在IdCard.hbm.xml映射文件中是:
<one-to-one name="person"></one-to-one>
五 在测试类中的总结
在测试的时候一般为保存和查询的操作,分为以下几种情况:
(1)当是多对一或者是一对多的时候,保存的是向部门中插入的name,和员工中插入的name,员工因为是多个,所以可以插入多个员工,并且把员工设置到Dempartment的对象中,其中对重要的是:
employee1.setDepart(department);
这句话是把两张表建立起来的
(2)在查询的时候是调用session的get方法,利用反射就能得到所关联的对象,例如:
Person person = (Person) session.get(Person.class, personId);
通过调用Person对象person.getIdCard()方法得到IdCard()类