У вас есть три основных способа загрузки данных в объекты из решения на основе JPA. Это:
- Загрузка динамически путем обхода объекта (например, myObject.getMyCollection (). Get ()).
- Загрузка графиков объектов путем динамической предварительной выборки с использованием JPA QL (например, FETCH JOINs, как описано в учебник Oracle JPA )
- Загрузка путем установки режима выборки ( Есть ли способ изменить тип выборки JPA для метода? )
У каждого из них есть свои плюсы и минусы.
- Динамическая загрузка с помощью трансверсального объекта приведет к увеличению количества запросов (с высокой степенью таргетинга). Эти запросы, как правило, небольшие (не большие операторы SQL, но могут загружать много данных) и, как правило, прекрасно работают с кешем второго уровня, но вы можете получить много-много маленьких запросов.
- Предварительная выборка с помощью JPA QL даст вам именно то, что вы хотите, но это предполагает, что вы знаете, чего хотите.
- Установка режима выборки в EAGER автоматически загрузит много и много данных для вас, но в зависимости от конфигурации и использования это может на самом деле не сильно помочь (или может ухудшить ситуацию), так как вы можете перетащить LOT данных из БД в ваше приложение, которые вы не ожидали.
Несмотря на это, я настоятельно рекомендую использовать p6spy (http://sourceforge.net/projects/p6spy/) в сочетании с любым приложением на основе JPA, чтобы понять эффекты вашей настройки.
К сожалению, JPA упрощает некоторые вещи, а некоторые затрудняет, в основном, побочные эффекты от вашего использования. Например, вы можете решить одну проблему, установив режим извлечения на «нетерпеливый», а затем создать еще одну проблему, когда стремительное извлечение извлекает слишком много данных. EclipseLink предоставляет инструменты, помогающие разобраться в этом ( EclipseLink Performance Tools )
Теоретически, если вы хотите, вы можете написать универсальный обходчик свойств JavaBean, используя что-то вроде Apache BeanUtils . Обычно достаточно просто вызвать метод, подобный size (), для принудительной загрузки (хотя использование размера выборки пакета может немного усложнить).
Одной вещью, на которую следует обратить особое внимание, является объем вашей сессии и использование вами кэшей ( EclipseLink cache ).
Что-то непонятное из вашего поста - это область сеанса. Является ли сеанс одним выстрелом (например, как запрос веб-страницы) или это длительный процесс (например, как классическое приложение клиент / сервер с графическим интерфейсом)?