因為在設計乙個樹形結構的實體中用到了多對一,一對多的對映關係,在載入其關聯物件的時候,為了效能考慮,很自然的想到了懶載入。
也由此遇到了n+1的典型問題 : 通常1的這方,通過1條sql查詢得到1個物件,而jpa基於hibernate,fetch策略預設為select(並非聯表查詢),由於關聯的存在 ,又需要將這個物件關聯的集合取出,集合數量是n,則要發出n條sql,於是本來的1條聯表查詢sql可解決的問題變成了n+1條sql
網上查詢資料,給出的解決方法是 : 不修改懶載入策略,jpa也不寫native sql,通過聯表查詢進行解決。
我為訂單設計了乙個典型的二叉樹結構,一共有三層:ship_order_info,ship_order_records,ship_order_logs,詳見
三個表之間逐級通過外來鍵關聯,關聯的子集fetch策略為懶載入。
然後查詢的時候,會hibernate發出多條sql,導致查詢時間大大加長,以至於呼叫這個方法的時候經常超時。
在網上找到乙個解決方案是使用@namedentitygraph註解,具體過程如下(這裡只對records表和logs表做了處理,查詢的也是records表):
@data
@entity(name = "shiporderrecords")
@table(name = "order_records")
@namedentitygraph(name="shiporderrecords.graph",attributenodes = )
public class shiporderrecords extends auditmodel implements serializable
自己再找找原因吧,jpa用起來坑是真的多。。。
還望jpa大神指導!
JPA 解決n 1次查詢問題
分兩步操作 1 主表實體類中,新增註解 namedentitygraph 如上,設定name值,並指定attributenodes 看名字就知道可以指定多個 每個node的值如下圖紅框 2 在主表的dao方法中 重寫用到的查詢方法,service層中呼叫什麼方法就重寫什麼方法,我這邊用到的是 pag...
關於N 1次查詢
1,什麼是n 1次查詢 在使用hibernate,或者ibatis等工具查詢資料庫的時候,由於快取,或者lazyload 懶載入 等原因,可能會造成要查詢n個結果,但是不得不執行n 1次查詢資料庫操作,造成效率低下。2,使用hibernate,什麼時候會產生n 1次查詢 a,使用iterate查詢的...
n 1次select查詢問題
什麼叫n 1次select查詢問題?在session的快取中存放的是相互關聯的物件圖。預設情況下,當hibernate從資料庫中載入customer物件時,會同時載入所有關聯的order物件。以customer和order類為例,假定orders表的customer id外來鍵允許為null,圖1列...