[hibernate] 設定檔中的 lazy, inverse, cascade 和 fetch

來源:互聯網
上載者:User
[hibernate] 設定檔中的 lazy, inverse, cascade 和 fetch2009-06-10 13:52
轉自:http://hi.baidu.com/zh_m_zhou/blog/item/77464a09dc52e638e92488bb.html

作者:pocky


hibernate真的還是比較花費學習成本的,最近查閱了大量的資料,總算有所收穫。在此,總結分享一下令眾多初學者暈眩的lazy,inverse,cascade和fetch。

lazy,就是延時載入。

以最簡單的parent和child為例子:一個parent可以有多個child,一個child只有一個parent。

當parent類的child屬性的lazy為true,那麼當select parent的時候,他的child不會馬上被select,一直延遲到他的child需要被讀寫的時候再去select。

當parent類的child屬性的lazy為false,那麼select parent的時候,他的child會馬上被select。


inverse,用於外鍵維護的控制。

當inverse為false,則在插入表資料之後,會再插入外鍵維護的記錄。

當inverse為true,則在插入表資料的同時,插入外鍵維護的記錄。


在非多對多的表關係中:

還是以parent和child為例子。假設1個parent有3個child,那麼:

當inverse為false,則先insert 1 條 parent,再insert 3 條 child,再insert 3 個child的parent ID,一共7次insert。

當inverse為true,則先insert 1 條 parent,再insert 3 條 child,當然這3次insert是同時完成插入parent ID的,所以一共4次insert。

總結:在非多對多的表關係中,inverse永遠為ture。


在多對多的表關係中:

中間表的外鍵維護通常由一方進行維護。

所以2個多方,1個inverse為ture,1個inverse為false。中間表會由inverse為false的一方維護。

總結:選擇資料比較多的一方維護中間表的效率會比較高。


cascade,表的級聯。

一方面,如果你熟悉資料庫,表級聯可以設定在資料庫上。

另一方面,如果你選擇設定在設定檔中,則相應的你的系統會更方便的在各個資料庫之間進行移植。

級聯具體情況就看業務需求了。關於級聯,不明白的可查閱資料庫基礎理論。沒什麼好多說的。


fetch,就是載入子表資訊所採用的方式,select或者join

以下是我個人對這個屬性的理解: 

xml設定檔中可以不配置,採用預設的。而他真正的作用在於:


1.通常情況為了保證效率,lazy的配置都是true的。比如有個頁面需要顯示parent列表,只需要parent的name屬性和create time屬性,因為不涉及子表資訊,lazy為false的配置將大大影響效率。這樣,我們就擁有了hibernate的高效能。


2.特殊情況下,我們又希望lazy為false,即當編輯某一個parent的時候,立刻獲得parent的子表,乃至孫表的資訊(例如當我們採用分層結構時,當資訊到視圖層時,hibernate的session已經斷開了,所以要在邏輯層完成所有資訊的載入)。我們就可以在HQL中寫left/right outer/inner join fetch實現此功能。這樣,我們又獲得了臨時的靈活性。



最後想說的,由於時間原因,沒有包含實際的例子,甚至有可能有錯誤的理解。當然,本文只是拋磚引玉。歡迎各位讀者的深入研究和指正。還有就是,參考文檔有比較詳細的例子,有空的話值得拜讀一下哦。


參考文檔

http://www.cnblogs.com/iloveu/archive/2009/02/22/1395628.html

http://hi.baidu.com/gingerlic/blog/item/c377f1338ba348ff1b4cff63.html

http://hi.baidu.com/xizenyin/blog/item/8ad6dfc4a31e46c338db49e1.html

http://www.javaeye.com/post/278782

https://www.hibernate.org/5.html

轉載自http://hi.baidu.com/zh_m_zhou/blog/item/77464a09dc52e638e92488bb.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.