Явное присоединение LAZY свойств в EJB3
Часто при использовании EJB возникает необходимость получить пропертисы объекта одним запросом, но проперти помечено как LAZY и исправлять на EAGER нежелательно. Выход в данной ситуации стандартными методами есть только один : опуститься на уровень native query. Ну или если хочется убить производительность, то разместить цикл опроса Lazy полей (это приведет к генерации циклических запросов к СУБД, и, соответственно, к деградации перформанса).Что же делать ? На помощь приходит возможность HQL указать хибернейту, что некоторые пропертисы или коллекции необходимо подгрузить сразу, не откладывая момент вызова lazy-прокси. Например,
select u from User u
inner join fetch u.company c
подгрузит присоединяемое свойство за один запрос в джойне так, как бы это было реализовано, используй мы native query.
Или
from Document fetch all properties
сделает все то же для всех свойств объекта Document.
После того, как все заработало, не поленитесь проверить в профайлере запросов, что сгенерировал хибер и какие запросы были выполнены. Возможно, что-то пошло не так, и запросы не отвечают требованиям производительности. Если это случилось – что ж, в любом случае у вас еще остаются native query 🙂
В общем, теперь можно не париться и объявлять все пропертисы по умолчанию как fetchMode = LAZY.
Подробнее синтаксис описан в документе http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html
1