Я новичок в Hibernate, но у меня большой опыт работы с Entity Framework на C#. Одна функция, которая мне нравится, — это возможность динамически решать, что сразу загружать в запросе. Например, рассмотрим отношение «один ко многим» сущностей класса и учащегося.
На странице "Просмотр классов" я могу сделать это:
context.Configuration.EnableLazyLoading = true; //default option
List<Classes> classes = context.Classes.ToList();
Теперь я могу просто показать информацию о классе, не тратя ресурсы на сбор данных об учениках. ТОЛЬКО когда пользователь нажимает «Просмотреть классы со списками», я делаю следующее:
context.Configuration.EnableLazyLoading = true;
List<Classes> classes = context.Classes.Include(c => c.Students).ToList();
С помощью одного этого утверждения я смог решить, что в этой конкретной ситуации я хочу получить всю информацию сразу. Не два запроса. Не сто запросов. Всего один запрос. Все, несмотря на загрузку только классов за несколько секунд до этого.
Все, что я читал о Hibernate, объясняет, как вы можете указать lazy="true|false" в файлах конфигурации отношений, но я действительно хочу иметь возможность решать, когда загружать коллекции на лету. В конце концов, я не заинтересован в покупке машины, которая едет только со скоростью 30 или 60 миль в час. Мне нужно выбрать скорость в зависимости от того, где я нахожусь.
Возможно, вариант использования режима выборки в качестве JOIN приемлем в том смысле, что в данной ситуации будет всего два запроса (один для класса и один для учеников), но мне очень понравилась возможность сделать все это в одном запросе, особенно если у меня есть несколько дочерних коллекций для загрузки и я не хочу выполнять запрос для каждой связи. Я понимаю, что соединения «все сразу» создают дополнительные данные, которые необходимо передавать в потоковом режиме, но я удивлен, что этот уровень контроля не так просто реализовать или он может быть полностью недоступен.