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集合属性引用但有属性引用的,则为单向关联。