вторник, 13 января 2009 г.

Решение проблемы с Lazy loading при использовании Hibernate через Spring


Hibernate поддерживает несколько стратегий загрузки связанных объектов из БД. Одной из самых популярных стратегий является т.н. ленивая загрузка - lazy loading. Предположим, что у нас есть сущность "блог", которая содержит свойство, представляющее собой коллекцию опубликованных постов (коллекцию сущностей типа "пост"). Согласитесь, что незачем выбирать из БД посты, если мы хотим всего лишь получить название блога. Добиться такого поведения нам и помогает ленивая загрузка - коллекция постов будет загружена из БД только, если мы захотим к ней обратиться.

Все операции с БД в Hibernate осуществляются через HibernateSession. В случае ленивой загрузки возможна ситуация, что после получения объекта типа "блог" сессия закроется. Тогда, при попытке обратиться к коллекции постов данного блога мы получим эксепшн. Hibernate не сможит вытянуть эту коллекцию из БД, потому что сессия уже закрыта.