Hibernate的多表操作

Posted zhuyesan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate的多表操作相关的知识,希望对你有一定的参考价值。

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











以上是关于Hibernate的多表操作的主要内容,如果未能解决你的问题,请参考以下文章

(十四)Hibernate中的多表操作:单向一对一

Hibernate中的多表操作:单向多对一

(十三)Hibernate中的多表操作:单向多对多

《Java从入门到放弃》入门篇:hibernate中的多表对应关系

3Hibernate的多表关联

hibernate的多表查询