Выборочные объединения и кэширование (или их комбинация) являются в основном единственными способами повышения производительности; будут ли они работать для вас, во многом зависит от того, как выглядят ваши сущности и что вы пытаетесь сделать.
Кэширование полезно для многозначных зависимостей с (несколько) ограниченным числом (идеально неизменных) экземпляров - например, поиск ссылок. Соединения извлечения могут использоваться для всех остальных «один к одному» и «многие к одному»; попытка получить вложенные коллекции быстро выходит из-под контроля очень .
Еще одна хитрость, которая применима в определенных случаях, - это предварительная загрузка (некоторых) ленивых зависимых объектов (если вы, конечно, знаете, что они есть заранее) в сеанс перед выполнением запроса. Таким образом, вам не придется сталкиваться с проблемами производительности / памяти кеша 2-го уровня в тех случаях, когда это нецелесообразно.
Все это говорит, что если в вашем списке 45 дополнительных запросов, о которых вы упомянули на сущность , вам, вероятно, придется где-то найти компромисс и кэшировать / извлекать некоторые зависимости, позволяя другим загружается с помощью последующего выбора.