2013-05-01 48 views
1

我注意到,在hibernate中,它一次查詢實體的子集合。所以,舉個例子,我有一個與PhoneNumber具有OneToMany關係的Person實體,以及與EmailAddress的OneToMany關係。如果我對返回1000人的Person實體做一個簡單的查詢,那麼hibernate將對EmailAddress進行1,000次查詢,對PhoneNumber執行1,000次查詢。讓我們忘記急於或懶惰提取一分鐘,並假設我將訪問每個人的電話和電子郵件收藏。JPA OneToMany和使用單個查詢獲取子女

這似乎是一個天真的實現。有沒有簡單的方法來改變這個,所以只有1個查詢到PhoneNumber中,只有1個查詢到EmailAddress中?這些應該放在由他們的Person外鍵鍵入的映射中,以便通過Person getter方法輕鬆檢索它們。

在執行Person查詢之前,除了在電子郵件和電話號碼的會話緩存中執行強力查詢之外,還有什麼想法嗎?

TIA,讓我知道你是否需要額外的數據。

回答

2

除了供自己做的查詢,你可以簡單地實現批量抓取,如the documentation描述:

您也可以在集合的批量抓取。例如,如果每個Person都有一個懶惰的Cat集合,並且當前在該Session中加載了10個人,則遍歷所有人將生成10個SELECT,每次調用getCats()時都會有一個SELECT。如果您在Person映射中爲cats集合啓用批量抓取,Hibernate可以預取集合: