Какой Hibernate FetchMode вызовет отложенную загрузку коллекций? - PullRequest
4 голосов
/ 04 декабря 2010

Я задал этот вопрос на форумах Hibernate, но не получил полного ответа, поэтому я решил опубликовать его здесь.Вот оригинальный поток вопросов:

http://forum.hibernate.org/viewtopic.php?f=1&t=1008243&p=2438963#p2438963

В двух словах, у меня есть собственный запрос HQL, который объединяет две совершенно не связанные таблицы, и я пытаюсь предотвратить "O (N + 1) выбирает «проблему», отключая загрузку связанных коллекций, которые существуют в моих POJO, отображенных в Hibernate.

Очевидно, я могу использовать для этого Hibernate извлекать профили , но есть загвоздка.Вот что говорит FetchMode.java из Hibernate:

/**
 * Fetch using an outer join. Equivalent to <tt>fetch="join"</tt>.
 */
public static final FetchMode JOIN = new FetchMode("JOIN");
/**
 * Fetch eagerly, using a separate select. Equivalent to
 * <tt>fetch="select"</tt>.
 */
public static final FetchMode SELECT = new FetchMode("SELECT");

/**
 * Fetch lazily. Equivalent to <tt>outer-join="false"</tt>.
  * @deprecated use <tt>FetchMode.SELECT</tt>
 */
public static final FetchMode LAZY = SELECT;

Итак, «LAZY» на самом деле не ленив, это просто «SELECT», чего я и стараюсь избегать.

Существует ли режим выборки, который не позволяет загружать коллекции?Если нет, есть ли другой способ отключить загрузку коллекций в ходе определенного запроса HQL?

Я понимаю, что общепринятый способ сделать это - использовать запросы Criteria, но мне нужно выполнить соединение по произвольному свойству, и, насколько я могу судить, критериев для этого нет.

1 Ответ

5 голосов
/ 04 декабря 2010

Во-первых, я считаю, что по умолчанию Hibernate использует ленивую загрузку.Поэтому убедитесь, что это не так.

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

...