2016-01-26 2 views
2

Я новичок в Hibernate, но имею большой опыт работы с Entity Framework в C#. Одна из особенностей, которую я люблю, - это способность динамически решать, что немедленно загружать в запрос. Например, рассмотрим взаимосвязь «один-ко-многим» класса и студенческих сущностей.Dynamic Eager & Lazy Загрузка в спящем режиме

На странице «Просмотр классов» Я могу это сделать:

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 приемлем тем, что в этой ситуации будут только два запроса (один для класса и один для студентов), но мне очень понравилось иметь возможность делать все это в одном запросе, особенно если у меня есть несколько дочерних коллекций для загрузки и вы не хотите выполнять запрос для каждой связи. Я понимаю, что объединения «все-в-одном» создают дополнительные данные, которые необходимо передать, но я удивлен, что этот уровень контроля нелегко сделать или может быть полностью недоступен.

+2

Что вы хотите сказать? –

ответ

0

Hibernate не имеет очень убедительных путей для динамического извлечения. Вы можете контролировать его

  1. Использование Dynamic fetching via HQL queries с join fetch (как это было предложено @ThibaultClement).
  2. Использование Dynamic association fetching с Criteria.setFetchMode().
  3. Использование Dynamic fetching via profiles с аннотацией @FetchProfile.

Вы можете сослаться на HQL joined query to eager fetch a large number of relationships и на дополнительные мысли.

+0

Достаточно честный. Я хотел быть уверенным, что не буду забывать о чем-то очевидном, тем более, что Hibernate имеет различные способы сбора данных. Мне просто нужно выйти из «Entity Framework Mindset» и понять, что разные ORM не будут иметь 1-1 соответствия функций. – AirmanAJK

+0

@AirmanAJK Может быть, вам будет интересно взглянуть на [Querydsl] (http://www.querydsl.com/), если вы еще этого не сделаете. –

Смежные вопросы