Hibernate級聯關係的說明和優化

張國平發表於2010-04-14

 

今天接到一個公司的電話面試,裡面問道Hibernate的級聯,很失敗,竟然回答的吞吞吐吐的,失敗。前幾天剛剛做了,看開做東西要仔仔細細,馬虎問題大。

說說級聯吧:

========================INVERSE===============================

Hibernate裡面的inverse 有兩個值 true ,false  ;

inverse的意思是翻轉,這裡面理解為對對應表的的維護

http://space.itpub.net/22259926/viewspace-631423

裡面說的,如果inverse為false的化,delete不會修改order表單,即對應關係沒有維護。但是新增的時候,會增加order表單,

下面是轉載的,

========================CASCADE===========================


cascade 有五個選項 分別是: all ,delete ,none,save-update,delete-orphan ;
        all : 所有情況下均進行關聯操作。
        none:所有情況下均不進行關聯操作。這是預設值。
        save-update:在執行save/update/saveOrUpdate時進行關聯操作。
        delete:在執行delete時進行關聯操作。
        delete-orphan: 當save/update/saveOrUpdate時,相當於save-update ;當刪除操作時,相當於delete ;


all的意思是save-update + delete
all-delete-orphan 的意思是當物件圖中產生孤兒節點時,在資料庫中刪除該節點
all比較好理解,舉個例子說一下all-delete-orphan:
Category與Item是一對多的關係,也就是說Category類中有個Set型別的變數items.
舉個例子,現items中存兩個Item, item1,item2,如果定義關係為all-delete-orphan
當items中刪除掉一個item(比如用remove()方法刪除item1),那麼被刪除的Item類例項
將變成孤兒節點,當執行category.update(),或session.flush()時
hibernate同步快取和資料庫,會把資料庫中item1對應的記錄刪掉

========================LAZY===========================

結論1: HQL程式碼 > fetch(配置) > lazy (配置)
結論2: 預設 lazy="true"
結論3: fetch 和 lazy 主要是用來級聯查詢的,  

             fetch引數指定了關聯物件抓取的方式是select查詢還是join查詢,select方式時先查詢返回要查詢的主體物件(列表),再根據關聯外來鍵id,每一個物件發一個select查詢,獲取關聯的物件,形成n+1次查 詢; 而join方式,主體物件和關聯物件用一句外來鍵關聯的sql同時查詢出來,不會形成多次查詢。
如果你的關聯物件是延遲載入的,它當然不會去查詢關聯物件。 另外,在hql查詢中配置檔案中設定的join方式是不起作用的(而在所有其他查詢方式如get、criteria或再關聯獲取等等都是有效的),會使用select方式,除非你在hql中指定join fetch某個關聯物件。fetch策略用於定義 get/load一個物件時,如何獲取非lazy的物件/集合。 這些引數在Query中無效。

========================batch-size==============================

今天有個問題,就是一對多查詢時候,比如Customer裡面包含了太多Order表單怎麼優化?當時懵了

其實可以使用Hibernate的延遲載入功能,即時Lazy=true,只有在真正需要的時候,才去從資料庫載入“本體”,Customer的某個Order,只用當該Order真正需要時候的,採取從資料庫載入

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-659765/,如需轉載,請註明出處,否則將追究法律責任。

相關文章