一.一对多

    1.表设计:主外键关联

    2.持久类设计:一方持有多方的set集合,多方持有一方的对象

    3.配置文件:一方配置级联操作;一方放弃外键维护

 

二.多对多关系:

表设计:使用中间表来映射关系,各添加一个外键字段

持久类设计:互相拥有对方的一个set集合


 

三.多表查询: 

默认策略:一查多延迟加载,多查一立即加载

 

关键词:

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没有直接关系,学习的时候不要搅在一起