Hibernate中fetch和lazy介紹

2022-06-26 04:15:11 字數 1165 閱讀 6122

fetch ,指定關聯物件抓取的方式,可以設定fetch = "select" 和 fetch = "join"。select方式時先查詢返回要查詢的主體物件(列表),再根據關聯外來鍵id,每乙個物件發乙個select查詢,獲取關聯的物件,形成n+1次查詢;而join方式,主體物件和關聯物件用一句外來鍵關聯的sql同時查詢出來,不會形成多次查詢。

在對映文件中定義的抓取策略將會有產生以下影響:

(1)通過get()或load()方法取得資料。

(2)只有在關聯之間進行導航時,才會隱式的取得資料(延遲抓取)。

(3)在對映文件中顯式的宣告連線抓取做為抓取策略並不會影響到隨後的hql查詢。

通常情況下,我們並不使用對映文件進行抓取策略的定製。更多的是,保持其預設值,然後在特定的事務中, 使用hql的左連線抓取(left join fetch) 對其進行過載。這將通知 hibernate在第一次查詢中使用外部關聯(outer join),直接得到其關聯資料。 在條件查詢 api中,應該呼叫 setfetchmode(fetchmode.join)語句。

用一對多來舉例:

fetch = "select"是在查詢的時候先查詢出一端的實體,然後在根據一端的查詢出多端的實體,會產生1+n條sql語句;

fetch = "join"是在查詢的時候使用外連線進行查詢,不會差生1+n的現象。

lazy大家應該都熟悉了,就是延遲載入,可以設定lazy = "true" , lazy = "false" lazy = "proxy" 。

在hql查詢中配置檔案中設定的join方式是不起作用的(而在所有其他查詢方式如get、criteria或再關聯獲取等等都是有效的),會使用select方式,除非你在hql中指定join fetch某個關聯物件。

lazy 和fetch配合使用:

1、當lazy="true" fetch = "select" 的時候 , 這個時候是使用了延遲策略,開始只查詢出一端實體,多端的不會查詢,只有當用到的時候才會發出sql語句去查詢 ;

2、當lazy="false" fetch = "select" 的時候 , 這個時候是使沒有用延遲策略,同時查詢出一端和多端,同時產生1+n條sql.

3、當lazy="true"/lazy="false" fetch = "join"的時候,自己認為這個時候延遲已經沒有什麼用了,因為採用的是外連線查詢,同時把一端和多端都查詢出來了,延遲沒有起作用。

Hibernate中fetch和lazy介紹

fetch 指定關聯物件抓取的方式,可以設定fetch select 和 fetch join select方式時先查詢返回要查詢的主體物件 列表 再根據關聯外來鍵id,每乙個物件發乙個select查詢,獲取關聯的物件,形成n 1次查詢 而join方式,主體物件和關聯物件用一句外來鍵關聯的sql同時...

Hibernate中的fetch和lazy介紹

fetch 指定關聯物件抓取的方式,可以設定fetch select 和 fetch join select方式時先查詢返回要查詢的主體物件 列表 再根據關聯外來鍵id,每乙個物件發乙個select查詢,獲取關聯的物件,形成n 1次查詢 而join方式,主體物件和關聯物件用一句外來鍵關聯的sql同時...

Hibernate 抓取策略Fetch

lazy與fetch 如果fetch為 join lazy不論設定成什麼樣的值,都不起作用 如果fetch為 select 先載入classes,再載入student,而lazy決定在什麼時候載入studentpublic class fetchtest extends hibernateutil ...