2015-09-01 2 views
0

Рассматривайте два связанных объекта Bill и BillItem. Все счета имеют несколько элементов счета. Bill класс имеет getItems, который настроен как OneToMany с нетерпением.Использует ли спящий режим соединения для объектов, связанных с автозагрузкой

Если я выберу набор векселей (скажем, сегодня для одного клиента), который возвращает 5 счетов. Каждый счет имеет несколько элементов счета.

Может ли Hibernate использовать соединение на столах Bill и BillItem для загрузки деталей одним выстрелом? Или будет спящий режим использовать n + 1 запросов, где n - количество счетов?

Если использование запросов присоединения не является поведением по умолчанию, есть ли способ настроить Hibernate для использования соединения в этом случае? Или это потребует использования HQL и некоторых пользовательских кодов для отображения?

Edit: Я думаю, это было описано здесь: JPA eager fetch does not join

+1

Вы можете включить ведение журнала sql в файле persistence.xml, чтобы увидеть фактический выполняемый запрос. –

+0

Я считаю, что вы можете либо загружать EAGER, либо каждый раз загружать BillItems, или вы можете LAZY загружать их, делая второй (или третий и т. д.), только если/когда вы действительно решаете использовать это поле. Не уверенный, как это работает под капотом, возможно, также, что EAGER также выполняет несколько запросов, как только это произойдет раньше - что странно, потому что тогда этот параметр будет бесполезен. –

+0

Возможный дубликат [JPA eager fetch не присоединяется] (http://stackoverflow.com/questions/463349/jpa-eager-fetch-does-not-join) – Teddy

ответ

0

Ответ: "это зависит". В общем случае очень легко получить страшные выборки N + 1, когда выборки небрежно. Вот почему вам нужно наблюдать за выполнением запросов и проверять, что они делают то, что вы ожидаете.

Существует много дискуссий вокруг оптимизации производительности JPA/Hibernate, в том числе избегая выбора N + 1 с помощью JOIN.