Hibernate檢索策略

2021-06-02 16:30:16 字數 4277 閱讀 3976

預設的檢索策略是立即檢索。在hibernate對映檔案中,通過在上配置 lazy屬性來確定檢索策略。對於session的檢索方式,類級別檢索策略僅適用於load方法;也就說,對於get、qurey檢索,持久化物件都會被立即載入而不管lazy是false還是true.一般來說,我們檢索物件就是要訪問它,因此立即檢索是通常的選擇。由於load方法在檢索不到物件時會丟擲異常(立即檢索的情況下)

檢索策略可以分為:

1、            類級別的檢索

(1)      hibernate3之前採用的都是立即檢索策略

(2)      hibernate3採用的是延遲檢索策略:

(3)public voidfindbyid()

(5)  當執行上面幾行**時,控制台視窗中不會發出sql語句,只有在上面的方法中加system.out.println(cs.getemail());才會輸出sql語句。如下:

(6)  hibernate: selectcustomers0_.id as id0_0_, customers0_.realname as realname0_0_,customers0_.pass as pass0_0_, customers0_.*** as ***0_0_, customers0_.petnameas petname0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from pros.customers customers0_ where customers0_.id=?

1)        立即檢索策略

優點:對應用程式完全透明,不管物件處於持久化狀態還是游離狀態,應用程式都可以從乙個物件導航到關聯的物件

缺點:1) select語句的數目太多,需要頻繁地訪問資料庫,會影響檢索效能。如果需要查詢n個customer物件,那麼必須執行n+1次select查詢語句。這種檢索策略沒有利用sql的連線查詢功能

2) 在應用邏輯只需要訪問customer物件,而不需要訪問order物件的場合,載入order物件完全是多餘的操作,這些多餘的order物件白白浪費了許多記憶體空間

優先考慮使用的場合:

(1)類級別

(2)應用程式需要立即訪問的物件

(3)使用了二級快取

2)        延遲檢索策略

a)        優點:

i.             由應用程式決定需要載入哪些物件,可以避免執行多餘的select,以及避免載入應用程式不需要訪問的物件。因此能提高檢索效能,並節省記憶體空間。

b)       缺點:

i.             應用程式如果希望訪問游離狀態的**類例項,必須保證她在持久化狀態時已經被初始化。

c)        優先考慮使用的場合:

i.             (1)一對多或者多對多關聯

ii.             (2)應用程式不需要立即訪問或者根本不會訪問的物件

2、            延遲檢索策略

迫切左外連線檢索策略

優點:(1)      對應用程式完全透明,不管物件處於持久化狀態還是游離狀態,都可從乙個物件導航到另乙個物件

(2)      使用了外連線,select語句少

缺點:(1)      可能會載入應用程式不需要訪問的物件,浪費記憶體

(2)      複雜的資料庫表連線也會影響檢索效能

優先考慮使用的場合:

(1)      多對一

(2)      需要立即訪問的物件

(3)      資料庫有良好的表連線效能

關聯級別檢索策略,要給它配置屬性fetch

在對映檔案中,用set元素來配置一對多關聯關係,set元素有lazy和fetch屬性

1、  lazy:主要決定orders集合被初始化的時機,既到底是在載入customer物件時被初始化還是在程式訪問orders集合時被初始化

2、  fetch:取值為select或subselect時,決定初始化orders的查詢語句的形式;若取值為join,則決定orders集合屬性被初始化的時機

3、  若把fetch設定為join,lazy屬性將被忽略

當fetch的值為join時,不管lazy的屬性值為什麼,採用的策略都是迫切左外聯接檢索

hibernate: selectcustomers0_.id as id0_1_, customers0_.realname as realname0_1_,customers0_.pass as pass0_1_, customers0_.*** as ***0_1_, customers0_.petnameas petname0_1_, customers0_.email as email0_1_, customers0_.rdate as rdate0_1_,orders1_.cid as cid0_3_, orders1_.id as id3_, orders1_.id as id1_0_,orders1_.number as number1_0_, orders1_.address as address1_0_, orders1_.phoneas phone1_0_, orders1_.odate as odate1_0_, orders1_.sum as sum1_0_,orders1_.status as status1_0_, orders1_.cid as cid1_0_ from pros.customerscustomers0_ left outer join pros.orders orders1_ on customers0_.id=orders1_.cidwhere customers0_.id=?

當fetch的值為select時,採用的策略主要根據lazy的取值決定

lazy=true

hibernate: selectcustomers0_.id as id0_0_, customers0_.realname as realname0_0_, customers0_.passas pass0_0_, customers0_.*** as ***0_0_, customers0_.petname as petname0_0_,customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ frompros.customers customers0_ where customers0_.id=?

lazy=false

hibernate: selectcustomers0_.id as id0_0_, customers0_.realname as realname0_0_,customers0_.pass as pass0_0_, customers0_.*** as ***0_0_, customers0_.petnameas petname0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_from pros.customers customers0_ where customers0_.id=?

hibernate: select orders0_.cidas cid0_1_, orders0_.id as id1_, orders0_.id as id1_0_, orders0_.number asnumber1_0_, orders0_.address as address1_0_, orders0_.phone as phone1_0_,orders0_.odate as odate1_0_, orders0_.sum as sum1_0_, orders0_.status as status1_0_,orders0_.cid as cid1_0_ from pros.orders orders0_ where orders0_.cid=?

lazy=extra

hibernate: select customers0_.id as id0_0_,customers0_.realname as realname0_0_, customers0_.pass as pass0_0_,customers0_.*** as ***0_0_, customers0_.petname as petname0_0_,customers0_.email as email0_0_, customers0_.rdate as rdate0_0_ frompros.customers customers0_ where customers0_.id=?

當fetch的值為subselect時,lazy的屬性值同樣分為false、true和extra三種情況,採用的檢索策略為巢狀子查詢(檢索多個customer物件時)lazy屬性決定檢索策略

Hibernate 檢索策略

在預設情況下,當hibernate從資料庫中載入物件時,會同時載入所有關聯的物件.但實際應用中可能不需要使用其關聯的物件,這樣就可能通過設定hibernate的檢索策略,來優化檢索效能.hiberante提供了3種檢索策略 1 立即檢索 2 延遲檢索 3 迫切左外連線檢索 下面先從概念上去理解,先在...

hibernate 檢索策略

本文主要是學習hibernate的檢索策略 1 類級別的檢索策略有兩種一種是立即檢索,一種是延遲檢索,僅影響load操作 立即檢索,是類的預設檢索方式,或者設定了lazy false 也是立即檢索方式,即執行load操作之後會立馬返回相應的資料。延遲檢索,當類設定lazy true 時,hibern...

hibernate 檢索策略

不浪費記憶體 提高查詢效率 lazy false 立即檢索 lazy true 延遲檢索 batch size x 批量預抓取數量設定 lazy true false extra true為延遲檢索 false為立即檢索 extra為增強延遲檢索 例如只使用size 方法,則只會傳送一條count的...