1. 程式人生 > >Hibernate的多表操作

Hibernate的多表操作

nsa 執行 添加數據 什麽事 為什麽 -s 使用 一次 class

一.一對多 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的多表操作