我有JPA實體與客戶的ManyToOne關係的訂單。它是雙向的,所以客戶也有OneToMany現場訂單。這兩種關係都使用EAGER抓取(或者在OpenJPA fetchplan中)。阻止JPA中的N + 1選擇
當我從訂單中選擇時,我得到1選擇訂單和N選擇Customer.orders字段。令我驚訝的是,即使當我使用JOIN FETCH(它可以在單向情況下工作)時,OpenJPA,EclipseLink和Hibernate也會出現這個問題。
有沒有解決這個問題的好方法? 有沒有解決方案來解決更復雜圖形的N + 1選擇問題?
編輯:我自己的研究結果: - 對於OpenJPA的(我使用的),我不知道解決辦法還沒有 - 對於休眠@Fetch(FetchMode.SUBSELECT)解決了這個問題。使用@BatchSize也有幫助,它同時選擇給定數量的customer.orders字段。 - 對於EclipseLink,我發現了一個類似的特性@BatchFetch(value = BatchFetchType.IN),但在這種情況下它並沒有幫助,我想它無法在雙向關係中有效地處理這個問題。
這是一個棘手的問題。您是否有*想要幫助的特定問題?或者您只是想抱怨JPA? – millimoose
你是對的,我對JPA感到有些沮喪,我會編輯我的問題,以達到更高的要求。 –
您是否真的需要EAGER獲取Customer.orders? – Esteve