一.一对多
1.表设计:主外键关联
2.持久类设计:一方持有多方的set集合,多方持有一方的对象
3.配置文件:一方配置级联操作;一方放弃外键维护
二.多对多关系:
1.表设计:使用中间表来映射关系,各添加一个外键字段
2.持久类设计:互相拥有对方的一个set集合
3.配置文件:默认双方都会维护中间表;如果双方都设置了对方的数据,必须有一方主动放弃外键维护(inverse="true"),否则会造成向中间表中重复添加数据,出现异常.
三.多表查询:
对象导航的延迟加载(lazy属性)使用默认策略:一查多延迟加载,多查一立即加载
关键词:
1.cascade 级联 操作一个对象同时操作其关联对象
一次save操作,发出多条insert语句,让所有的对象都变成持久态;
2.inverse 放弃外键维护 是<oneToMany>(一方)的属性
外键维护有两层含义:1)主外键映射(那条线) 2)外键列正常添值(非null)
能够维护外键的条件:
1)在配置文件中配置了外键关联 2)持有要维护的数据; 3)有维护权
注:inverse="true/false" 只是指定在双方都能维护的时候,默认由哪一方来维护外键,不能决定最终执行维护的是哪一方;
比如:一方不放弃维护权,但是一方不持有多方数据导致无法维护外键(有权利没能力),那只能放弃交给多方来维护外键.
3.对象映射的set集合初始化为什么是0?
节省内存
4.瞬时态异常(一对多):org.hibernate.TransientObjectException:
object references an unsaved transient instance - save the transient instance before flushing:com.itheima.domain.LinkMan
瞬时态异常的发生情景:当你想要省略save操作,却又没有配置级联的时候,有可能会发生(不一定发生)
瞬时态异常的发生条件:在提交事务,数据持久化到数据库的过程中,当其中的一方要维护外键数据却找不到数据(对方没有持久化到数据库),就会发生瞬时态异常
1.没有级联,只保存一方(一方维护外键),在数据库中 一方会因为找不到多方的数据而报出异常
2.没有级联,只保存一方(多方维护外键),在数据库中 一方不需要处理多方的数据,这种情况下不会有异常,但是从表无数据.
3.没有级联,只保存多方(多方维护外键),在数据库中 多方会因为找不到一方而报出异常
4.没有级联,只保存多方(一方维护外键),在数据库中 多方会因为找不到一方而报出异常
案例1演示:长官拿着花名册,到了战场上,点名却找不到士兵
案例2演示:长官到达战场,不需要做什么事儿,等着士兵来报道
案例3演示:士兵到达战场,向长官报到,高喊:"汤姆上尉,你在哪里..." 小沈阳:"对不起,没有上尉"
案例4演示:士兵到达战场,高喊:"我的长官是谁..."(这也是多余update语句的原因)
注意:虽然一方和多方的类都持有对方的数据,但是瞬时态异常是发生在数据库操作的时候,因为无法完成主外键的映射造成的,需要使用的数据没有持久化到数据库;
解决瞬时态异常:很简单,配置级联保存(简单)或者save全部对象(太麻烦),这样的话在数据库中双方都有数据了;
5.cascade和inverse没有直接关系,学习的时候不要搅在一起