在場景中有兩種類型的實體,父母與子女:JPA /休眠的大集合
家長 - @OneToMany收集兒童;
默認情況下,延遲加載子集合。這種模式適用於少數兒童,但如果數量變得非常大,這似乎難以爲繼。所以對於我認爲孩子數量非常大的場合,我使用了分頁服務方法(如「getChildren(Parent parent,int offset,int count)」)。
問題是:這是處理這種情況的最佳方法嗎?或者我錯過了什麼?
感謝, 彼得
在場景中有兩種類型的實體,父母與子女:JPA /休眠的大集合
家長 - @OneToMany收集兒童;
默認情況下,延遲加載子集合。這種模式適用於少數兒童,但如果數量變得非常大,這似乎難以爲繼。所以對於我認爲孩子數量非常大的場合,我使用了分頁服務方法(如「getChildren(Parent parent,int offset,int count)」)。
問題是:這是處理這種情況的最佳方法嗎?或者我錯過了什麼?
感謝, 彼得
這種模式的偉大工程,爲孩子們的小數目,但如果數量變得非常大,這似乎是不可持續的。
我想說這一切都取決於你想要對他們做什麼,但在大多數情況下,這是真的。
因此,對於我認爲孩子數量非常大的場合,我已經使用了帶分頁的服務方法(如「getChildren(Parent parent,int offset,int count)」)。
尋呼是一個很自然的方法,如果你需要顯示一個(可能非常)大量結果用於瀏覽。人類通常不需要或不需要所有記錄,無論如何他們不能處理大量的結果。應用程序必須同時處理所有結果的情況當然不同,但JPA可能根本不適合他們。
問題是:這是處理這種情況的最佳方法嗎?或者我錯過了什麼?
IMO,它絕對比與整個集合,你會通過調用parent.getChildren()
得到餵養結果頁面要好得多,這將節省一些數據庫,網絡,應用服務器資源。
您可能會考慮的另一件事是在執行搜索時限制結果的最大數量。而不是分頁10⁶的結果(誰會去瀏覽這個結果?),這是很常見的(至少對我的經驗來說)要求用戶執行更嚴格的搜索,即添加搜索條件,直到結果的數量變得可人爲管理。雖然這與你最初的問題有點不同。
你需要所有的孩子嗎?或者你只是要從返回的整個列表中選擇一些?如果是這樣,直接在子實體上查詢你想要的東西。 如果您需要全部,請查看分頁。
像你這樣做(即通過單獨的查詢加載孩子)可能是最好的解決方案。
需要考慮的其他事情:Hibernate可以選擇集合的"extra-lazy" loading。通過常規的延遲加載,整個集合在第一次訪問時加載;但在超懶惰模式下,Hibernate可能會根據需要一次加載一些元素。我不認爲有任何方式可以訪問這個功能,除非你直接使用Hibernate API-- JPA只知道「懶」和「急於」。
謝謝,這是我需要的保證。如果你關心的是,當你做域名設計的時候 - 你是否有從域名所有者到子女的收藏,只是爲了保持領域模型設計「正確」,或者你是否跳過它,只有從子女到父母的關係? – 2010-09-24 08:11:11
@Piotr我不會讓他們只爲領域模型的正確性。 – 2010-09-25 12:31:11