В HQL можно переопределить LAZY
, используя LEFT JOIN FETCH
.Спящий режим: переключение отображения EAGER в HQL?
FROM Obj AS obj LEFT JOIN FETCH obj.otherObj WHERE obj.id = :id
Можно ли переопределить EAGER
? Как?
В HQL можно переопределить LAZY
, используя LEFT JOIN FETCH
.Спящий режим: переключение отображения EAGER в HQL?
FROM Obj AS obj LEFT JOIN FETCH obj.otherObj WHERE obj.id = :id
Можно ли переопределить EAGER
? Как?
Классификатор в этом фрагменте из Hibernate Docs означает, что вы можете переопределить ленивыми с энергичны, но не наоборот:
Если вы используете свойство уровня ленивым выборки (с байткодом приборов) , можно заставить Hibernate получить ленивые свойствам в первом запросе сразу же используя выборку всех объектов.
Необычно, похоже, что вы можете использовать API критериев, чтобы перейти от нетерпения к ленивому. Просто позвоните setFetchMode(FetchMode.LAZY)
по соответствующему соединению.
У меня была ситуация, которая по историческим причинам действительно вызывала выбор между несколькими зависимостями «один-ко-многим». В течение многих лет многие места зависели от этого, поэтому было трудно отключить. Однако в некоторых случаях нетерпеливая выборка мешала: для каждого большего выбора в таблице она создавала бы 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 найдет все необходимое для заполнения желаемых коллекций в кеше объектов.
Обратите внимание, что этот подход также имитирует быструю выборку для коллекций, которые настроены на то, чтобы быть ленивыми, поскольку вы заполняете все «ленивые» коллекции с нетерпением (и эффективным) способом.
Похоже, что setFetchMode (FetchMode.LAZY) по-прежнему получает их несколько с нетерпением (т. Е. Они не извлекаются с помощью целевого соединения, а через n + 1 выбираются после начального SQL-запроса). Кажется, что нет способа полностью переопределить настройку EAGER. – jsight
У меня такой же опыт. JavaDoc для этой аннотации, по-видимому, оспаривается (http://opensource.atlassian.com/projects/hibernate/browse/HHH-980), но независимо от того, использует ли SELECT или LAZY детей EAGER. Не уверен, что я делаю что-то неправильно, или если есть ошибка Hibernate. – atrain
'FetchMode.LAZY' также устарел –