Hibernate关联关系的精髓总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值