Работа с отложенной загрузкой является постоянной проблемой при работе с Hibernate, JPA или ORM в целом.
Речь идет не только о предотвращении исключения LazyInitializationException, но и об эффективной обработке запросов.Даже при использовании общих DAO стратегия должна извлекать как можно больше только тех данных, которые вам действительно нужны.
Книга Pro JPA 2
от Mike Keith от Apress посвящает этому целый раздел, но, похоже,быть универсальным решением, которое всегда работает.
Время от времени это может помочь сделать соединения FETCH.Это означает, что вы не используете метод find менеджера сущностей, а используете JPQL (или HQL, если это ваш яд) запросы для всего.Ваши DAO могут содержать несколько разных методов, которые таким образом выводят граф сущностей на разные уровни.Данные обычно выбираются достаточно эффективно, но в большинстве случаев вы можете получить слишком много данных.
Другое решение, предложенное Майком Китом, также использует extended persistence context
.В этом случае контекст (сеанс Hibernate) не связан с транзакцией, но остается открытым.Таким образом, объекты остаются подключенными, и ленивая загрузка работает, как и ожидалось.
Вы должны в конечном итоге закрыть расширенный контекст.Одним из способов сделать это является управление им сессионным компонентом с отслеживанием состояния, который связан с некоторой областью действия, например областью запроса или областью диалога.Таким образом, bean-компонент будет автоматически уничтожен в конце этой области, и он, в свою очередь, автоматически закроет контекст.
Однако он не без собственных проблем.Открытый контекст будет по-прежнему потреблять память, и его сохранение в течение более длительного периода времени (обычно дольше, чем область запроса) может создать серьезные риски для нехватки памяти.Если вы знаете , вы имеете дело только с несколькими объектами, это нормально, но вы должны быть осторожны.
Другая проблема, связанная с зависимой загрузкой, - это хорошо известный запрос 1 + Nпроблема.Повторение списка результатов даже среднего размера может привести к отправке сотен или тысяч запросов в БД.Я думаю, мне не нужно объяснять, что это может полностью разрушить вашу производительность.
Эта проблема с запросом 1 + N иногда может быть решена, если в значительной степени полагаться на кэширование второго уровня.Если количество сущностей не так велико и если они не обновляются так часто, то убедитесь, что они все кэшированы (с использованием кеша сущностей Hibernate или JPA 2-го уровня), что может значительно уменьшить эту проблему.Но ... это два больших "если".И если ваша основная сущность ссылается только на одну сущность, которая не кэшируется, вы снова получите сотни запросов.
Еще один подход заключается в использовании поддержки fetch profile
в Hibernate, которая может частичносочетаться с другими подходами.Справочное руководство имеет раздел по этому вопросу здесь: http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-fetching-profiles
Таким образом, похоже, нет однозначного ответа на ваш вопрос, но есть только множество идей и практик, которые все сильно зависят от вашего индивидуума.ситуация.