Hibernate各种关联映射关系梳理

Hibernate各种关联映射关系梳理

多对一的单向关联关系

1.      了解表结构及其关系

采用两张表作为今天的样表:

 

2.      了解类结构和映射文件:

有两个类:

Street类的映射文件:



Street类的类结构:

 

District类的映射文件:



District类的类结构:



梳理关系:

District表为主表,Street表为从表,那么可以得出以下结论:

●  Street表中的DISTRICT_ID列为外键,且参照District表中的主键。因为某街道属于某区县,而不能说某区县属于某一个街道;

●  Street表既然是从表,那么Street类也就成了主动维护彼此关系的一方了。因为Street表中有一个外键关联到了District表,当Street表中做了某些改动后,他可以主动改动District表;这里为什么District类不能主动维护关系呢?其实也可以,只不过它改动完自己之后还需要“反向关心”一下与他关联的表,执行时除了两条insert into语句之外还会多出一条update语句,这就是把主表作为主动维护关系那一方的弊端,主表不能直接感知到从表的变动,因为主表中就只有一个主键,没有其他任何的关系;

●  根据类结构可以看到,District类(主)中没有包含引用Street类的属性:


但在Street(从)类中有引用District类的属性:



3.      进行操作:

●  添加区县:



●  添加街道,设置该街道属于某区县:



●  修改街道,把该街道调到某区县:



●  删除某街道:



一对多的双向关联关系

1.      了解表结构及其关系

表结构就不多说了,和上同;

 

2.      了解类结构和映射文件:

有两个类:

Street类的映射文件:

 

Street类的类结构:


District类的映射文件:



District类的类结构:



梳理关系:

District表为主表,Street表为从表,可得出以下结论:

●  上面已经提到Street表对应的类具有主动维护权,所以:

Street类中的标签仍为<many-to-one>,即:“many”的一方为Street类;

District类中的标签为<one-to-many>,即:“one”的一方为District类,且因为是双向关联,彼此之间都必须含有对方所引用的属性。在District类中有一个引用街道类型的Set集合;




3.      进行操作

●  添加区县的同时添加该区县下的两个街道:


●  设置区县的inverse属性值为true,修改某区县,从该区县中移走某一街道:



多对多的单向关联关系

1.      为何产生?

一个项目需要多位员工共同参与开发;

一位员工可能同时参与多个项目;

构成了项目与员工之间的多对多的关系。

 

2.      了解表结构及其关系

采用两张表外加一张临时的连接表作为今天的样表:



3.      了解类结构和映射文件:

有两个类:

Employee类的映射文件:



Employee类的类结构:

 

 

Project类的映射文件:



Project类的类结构:



 

梳理关系:

Employee表和Project表是双向关联的关系,但同时只能满足一种关系的存在:

要么:一个项目由多位员工参与,

要么:一位员工同时参与多个项目

为单向的多对多关联关系

 

4.      进行操作

●  保存项目的同时添加员工信息:



Hibernate显示的show_sql结果:



在配置单向多对多关联要注意:

●  使用MyEclipse Reverse Engineering进行表到类的映射时,切记不要选择连接表;

●  “单向多对多”可以这么理解:

一个人可同时有多个地址,

一个地址也可以同时属于多个人。

人和地址这两个对象作为任意一方为参照物,另一方都成立,都符合常理,但又只能同时处于一种情况(你总不能说多个地址同时属于多个人,是吧?)的,就属于“单向多对多”的关系模式;

●  使用MyEclipse Reverse Engineering进行表到类的映射时,要勾选“Enablemany-to-many detection”项。


 

 

多对多的双向关联关系

1.      为何产生?

多个项目可由多位员工开发;

多位员工也可以同时参与多个项目。

构成了项目与员工之间的多对多的关系。

 

2.      了解表结构及其关系

表和表结构与上同。

 

3.      了解映射文件和类结构:

总共有2个类文件和2个与其类文件对应的映射文件:

Project类的映射文件:

 

Project类的类结构:

 

Employee类的映射文件:

 

Employee类的类结构:



4.      进行操作

●  添加项目的同时添加员工:

 

●  将某员工加入到另一项目组:

 

●  当项目结项时,将此员工从该项目中移走:

 

 

 

总结

1.      主动方一般都位于子表中,即子表中的inverse属性为false(或不写)。

2.      为什么要将子表作为主动方去维护表间关系呢?

因为当子表做出改变时,会通过外键约束使得父表中也做相应的改动;

当父表作为主动方维护表间关系时,由于主表仅有主键,没有其他的外键关系,因而如在插入数据的情况下,除了两条正常的insert into语句之外,还会多出来一条update语句来强迫两表间数据的一致。

3.      在数据表映射的类之间,其中若有一个或多个类中有Set集合的引用,则说明是双向关联。可根据A类中引用的B类的属性的集合,使用OO的办法点出来B类的属性,而不用实例化一个B类的对象。反之,没有Set集合属性引用但有属性引用的,则为单向关联。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值