Hibernate N 1 問題及解決辦法

2021-08-27 10:22:40 字數 1090 閱讀 4604

hibernate n+1 問題及解決辦法

問題出現的原因:

hibernate 中常會用到 set , bag 等集合表示 1 對多的關係,在獲取實體的時候就能根據關係將關聯的物件或者物件集取出,還可以設定 cacade 進行關聯更新和刪除。這不得不說 hibernate 的 orm 做得很好,很貼近 oo 的使用習慣了。

但是對資料庫訪問還是必須考慮效能問題的,在設定了 1 對多這種關係之後,查詢就會出現傳說中的 n+1 問題。

一對多: 在一方,查詢得到了 n 個物件,那麼又需要將 n 個物件關聯的集合取出,於是本來的一條 sql 查詢變成了 n+1 條;

多對一: 在多方,查詢得到了 m 個物件,那麼也會將 m 個物件對應的 1 方的物件取出,也變成了 m+1 ;

解決問題的方法:

1、 使用 fetch 抓取, hibernate 抓取策略分為單端**和集合**的抓取策略。

hibernate 抓取策略 ( 單端**的抓取策略 ) :

保持預設也就是如下 :

fetch="select" 就是另外傳送一條 select 語句抓取當前物件關聯實體或者集合設定 fetch="join"

hibernate 會通過 select 語句使用外連線來載入器關聯實體活集合此時 lazy 會失效

hibernate 抓取策略 ( 集合**的抓取策略 ) :

保持預設( fetch="select" )也就是如下 :

1)fetch="select" 會另外發出一條語句查詢集合

2) 設定 fetch="join" 採用外連線集合的 lazy 失效

3) 這只 fetch="subselect" 另外發出一條 select 語句抓取前面查詢到的所有的實體物件的關聯集合 fetch 只對 hql 查詢產生影響其他的則不會

2、 使用 map 直接搜尋需要的列

如:產品 product 和產品分類 product_category 兩張表,多對一關係。查詢產品列表時

select new map(p.id as id, p.name as name, p.category.name as categoryname) from product p

如何解決Hibernate N 1問題

問題 什麼時候會遇到n 1的問題?備註 hibernate預設抓取策略是fetch select 不是fetch join 這都是為了延遲載入而準備的。出現情況 1 一對多 one to many 在1的這方,通過1條sql查詢得到了1個物件,由於關聯的存在 那麼又需要將這個物件關聯的集合取出,所以...

ruby cucumber環境配置問題及解決方法

一 安裝ruby 安裝完之後在命令視窗執行ruby v 提示ruby 不是內部命令或外部命令,也不是可執行的程式或批處理檔案 原因 安裝的時候提示說自動新增path 什麼的,那 兩個選項都應該打鉤 二 安裝devkit 的安裝目錄 在命令列下轉到devkit 的目錄 執行 ruby dk.rb in...

springMVC整合dubbo問題及解決方法

1.註解方式,提供者正常,但消費者獲取不到物件,提示空指標 測試過程中發現service必須宣告為static才可以正常使用。原因分析 與註解順序有關 解決方法 指定springmvc與dubbo註解掃瞄的順序 2.警告 多個不同應用註冊了相同服務,請檢查aaa provider和bbb provi...