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()类

相关内容