Сборка Hibernate оптимально - PullRequest
0 голосов
/ 25 июня 2010

У меня следующая структура

Магазин
Фальца
RebateMetadata
RebateCommission

Итак, отношение такое -

Store -> Rebate - отношение один ко многим Rebate -> RebateMetadata - это сопоставление «один к одному» Rebate -> RebateCommission - это взаимно-однозначное сопоставление

Мой запрос - загрузить все магазины. И с этим, загрузить все бонусы и метаданные и комиссии.

Я использую HQL:

Выбрать магазин из магазина как магазин;

Я ожидаю, что весь граф будет загружен как можно меньше SQL-запросов. Чтобы предотвратить проблему выбора n + 1, я использую выборку подвыбора между Store-> Rebate.

Однако, чтобы получить RebateMetadata и RebateCommission, я вижу запуск нескольких отдельных выборок (с объединениями). Что я должен сделать, чтобы минимизировать это?

Кроме того, у меня включен кэш 2-го уровня, но QueryCache выключен.

1 Ответ

0 голосов
/ 25 июня 2010

Вы можете попробовать получить соединение . Обычно мне требуется некоторое время, чтобы понять это, попробуйте что-то вроде:

select store from Store as store 
 left join fetch store.rebate rebate
 inner join fetch rebate.metadata 
 inner join fetch rebate.commission

edit : обновлено в соответствии со вторым-последним примером, который я связал в документах спящего режима. У этого больше шансов быть правильным.

Это, вероятно, не сработает, но это общая идея. В качестве альтернативы вы можете попробовать использовать пакетный размер (аннотация @BatchSize) для свойства, чтобы убедиться, что такие свойства загружаются, скажем, по 50 элементов за раз (с помощью запроса SELECT ... IN).

...