Hibernate關聯對映之延遲載入

2022-07-22 04:42:12 字數 2012 閱讀 5629

什麼事延遲載入?

當真正需要資料時才執行sql語句,其本意是減少不必要的效能開銷!

之前提到過乙個延遲載入的例子:

load();結果集不能為空

當真正去列印物件屬性時,sql語句才執行!

hibernate的lazy屬性:

lazy屬性

類級別:true(預設)/false

一對多關聯級別:true(預設)/extra(加強延遲載入)/false

多對一關聯級別:proxy(預設)/no-proxy(無**載入)/false

下面用**來區別他們:

類級別:

這裡使用load()屬性,get()屬性在操作類級別時不具備延遲載入特性

1

/**2

* 測試延遲載入3*/

4public

void

get()

1516

/**17

*--輸出了--

18*hibernate:

19* select

20* student0_.stuno as stuno1_0_,

21* student0_.name as name1_0_,

22* student0_.gradeid as gradeid1_0_

23* from

24* student student0_

25* where

26* student0_.stuno=?

27*小芳28*

29**/

可以看到延遲載入了!

現在我修改class lazy屬性為false;

/**

***/

/**get()方法裡面**不變*

*//**

*hibernate:

* select

* student0_.stuno as stuno1_0_,

* student0_.name as name1_0_,

* student0_.gradeid as gradeid1_0_

* from

* student student0_

* where

* student0_.stuno=?

*--輸出了--

*小芳*

**/

一對多關聯級別:現在我們將類級別去掉,一對多關聯獲取一遍,使用session.get()方法測試

1

/**2

* 一對多延遲載入3*/

4public

void

getbyone2more()

20session.close();

2122

23 }

預設配置下:

跟前面的一樣,先查詢年級。列印」輸出了「;

先執行了get()發起的select語句!

更改lazy 屬性為 extra:

輸出結果: 

注釋掉列印學生那句:

會發現查詢總記錄時,select count(stuno),我們在將extra改為true,這時候查詢語句select stuno,name......

總結:有的時候我們只需要知道集合中元素的個數,或者集合是否為空,並不需要知道都有哪些資料時,可以使用extra提高效率。

可見加強延遲載入採用了特定的語句查詢必要的語句

--多對一

預設的lazy屬性值為proxy;

設定為proxy時,延遲載入,同上,當查詢 id時,不會執行sql去查詢!

Hibernate關聯對映

單向關聯關係 單向1 1 和單向n 1配置唯一不一樣的地方是在many to one的標籤上加上unique true 即可完成1 1的對映 單向1 n public class person public int getid public void setid int id public stri...

Hibernate關聯對映

關聯對映分為 多對一關聯對映 一對一關聯對映 唯一外來鍵關聯 主鍵關聯 一對多關聯對映 多對多關聯對映 根據關聯關係鏈結的雙方是否能夠導航到彼此,我們將關聯關係分為單向關聯和雙向關聯 1.多對一關聯對映 many to one 我們使用元素來配置多對一關聯關係 name 待對映的持久化類的屬性名。c...

Hibernate關聯關係對映

1.單向一對一 1 主鍵關聯 兩個表通過主鍵建立一對一關聯關係,從表的主鍵由被關聯類生成。對映 class foreign name 關聯屬性的屬性名 class 持久化類 constrained true one to one 2 外來鍵關聯 兩張表的主鍵不同,通過在一張表中新增外來鍵來保持一對一...