2010-06-18 3 views

ответ

3

Классификатор в этом фрагменте из Hibernate Docs означает, что вы можете переопределить ленивыми с энергичны, но не наоборот:

Если вы используете свойство уровня ленивым выборки (с байткодом приборов) , можно заставить Hibernate получить ленивые свойствам в первом запросе сразу же используя выборку всех объектов.

Необычно, похоже, что вы можете использовать API критериев, чтобы перейти от нетерпения к ленивому. Просто позвоните setFetchMode(FetchMode.LAZY) по соответствующему соединению.

+1

Похоже, что setFetchMode (FetchMode.LAZY) по-прежнему получает их несколько с нетерпением (т. Е. Они не извлекаются с помощью целевого соединения, а через n + 1 выбираются после начального SQL-запроса). Кажется, что нет способа полностью переопределить настройку EAGER. – jsight

+0

У меня такой же опыт. JavaDoc для этой аннотации, по-видимому, оспаривается (http://opensource.atlassian.com/projects/hibernate/browse/HHH-980), но независимо от того, использует ли SELECT или LAZY детей EAGER. Не уверен, что я делаю что-то неправильно, или если есть ошибка Hibernate. – atrain

+0

'FetchMode.LAZY' также устарел –

4

У меня была ситуация, которая по историческим причинам действительно вызывала выбор между несколькими зависимостями «один-ко-многим». В течение многих лет многие места зависели от этого, поэтому было трудно отключить. Однако в некоторых случаях нетерпеливая выборка мешала: для каждого большего выбора в таблице она создавала бы 100 с небольших подзапросов для каждой из коллекций каждого из объектов. Я нашел способ обойти это, не переопределяя нетерпеливую выборку, но для меня так же полезно: просто создайте один запрос, который выполняет все подтипы одновременно. Это сделает 1 физический запрос к базе данных, вместо того, чтобы спящий режим прошел график зависимостей и породил 100 запросов.

Так я заменил

Query q = session.createQuery("from Customer c"); 

по

Query q = session.createQuery("from Customer c " + 
           "left join fetch c.vats v " + 
           "left join fetch v.klMemos bk " + 
           "left join fetch bk.ferryKlMemos"); 

1 Заказчик имеет много номеров НДС, номер 1 НДС имеет много klmemos и так далее. Старая ситуация сначала забирала только клиентов, а спящий режим затем начинал собирать каждую зависимую коллекцию один за другим. Вторая форма загрузит все в один исходный запрос, а hibernate найдет все необходимое для заполнения желаемых коллекций в кеше объектов.

Обратите внимание, что этот подход также имитирует быструю выборку для коллекций, которые настроены на то, чтобы быть ленивыми, поскольку вы заполняете все «ленивые» коллекции с нетерпением (и эффективным) способом.

Смежные вопросы