JPA / большие коллекции - PullRequest
       7

JPA / большие коллекции

4 голосов
/ 24 сентября 2010

В сценарии с двумя типами сущностей, Родитель и Дочерний:

Родитель - @OneToMany Коллекция дочерних элементов;

По умолчанию отложенная загрузка коллекции дочерних элементов.Эта модель отлично работает для небольшого числа детей, но если число становится очень большим, это кажется неустойчивым.Поэтому в тех случаях, когда я думаю, что число детей будет очень большим, я использовал вместо этого методы обслуживания с подкачкой страниц (например, «getChildren (родительский родитель, смещение int, int count)»).лучший способ справиться с такими ситуациями?Или я что-то пропустил?

Спасибо, Петр

Ответы [ 3 ]

7 голосов
/ 24 сентября 2010

Эта модель отлично подходит для небольшого числа детей, но если число становится очень большим, это кажется неустойчивым.

Я бы сказал, что все зависит от того, что вы хотите с ними делать, но в большинстве случаев это так.

Так что в тех случаях, когда я думаю, что число детей будет очень большим, я использовал методы обслуживания с подкачкой (например, "getChildren (Parent parent, int offset, int count)") вместо этого.

Пейджинг является очень естественным подходом, если вам нужно отобразить (потенциально очень) большое количество результатов для просмотра . Люди чаще всего не хотят или нуждаются во всех записях, и в любом случае они не могут иметь дело с огромным количеством результатов. Случай, когда приложения должны иметь дело со всеми результатами одновременно, конечно, отличается, но JPA может просто не подойти для них.

Вопрос: это лучший способ справиться с подобными ситуациями? Или я что-то пропустил?

IMO, это определенно намного лучше, чем заполнять страницу результатов всей коллекцией, которую вы получили бы, позвонив по номеру parent.getChildren(), и это сэкономит некоторые ресурсы базы данных, сети, сервера приложений.

Еще одна вещь, которую вы могли бы рассмотреть - ограничение максимального количества результатов при выполнении поиска. Вместо того, чтобы разбивать результаты на 10⁶ (кто вообще будет их просматривать?), Обычно (по крайней мере, по моему опыту) просить пользователя выполнить более строгий поиск, то есть добавлять критерии поиска, пока число результатов не станет управляемым человеком. Это немного отличается от вашего первоначального вопроса.

5 голосов
/ 24 сентября 2010

Поступать так, как вы (то есть загружать дочерние элементы отдельным запросом), вероятно, является лучшим решением.

Что еще нужно подумать: в Hibernate есть опция «экстра-ленивая» загрузка для коллекций. При обычной отложенной загрузке вся коллекция загружается при первом обращении к ней; но в очень ленивом режиме Hibernate может при необходимости загружать коллекцию из нескольких элементов. Я не думаю, что есть какой-либо способ получить доступ к этой функции, если вы не используете API Hibernate напрямую - JPA знает только о «ленивых» и «нетерпеливых».

0 голосов
/ 24 сентября 2010

Тебе нужны все дети?Или вы просто собираетесь выбрать несколько из всего возвращенного списка?Если это так, запросите непосредственно у дочерних объектов, что вы хотите.Если они вам нужны, изучите нумерацию страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...