Некоторые вопросы, касающиеся стратегий выборки в спящем режиме и связи типа fetch с fetchmode? - PullRequest
5 голосов
/ 23 января 2012

Я перебрал некоторые ссылки для стратегий извлечения в спящем режиме в сети. Одна краткая и краткая ссылка, которая мне понравилась, - http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/. У нас есть четыре типа стратегий извлечения.это: -

  1. fetch- ”join” = Отключить отложенную загрузку, всегда загружать все коллекции и сущности.
  2. fetch- ”select” (по умолчанию) = Lazy load allколлекции и сущности.
  3. batch-size = ”N” = извлечение до 'N' коллекций или сущностей, Не запись .
  4. fetch- ”subselect” =Сгруппируйте свою коллекцию в оператор sub select.

Мой первый вопрос, какой из перечисленных выше подходит для типа извлечения с нетерпением или с отложенной загрузкой?

Чтобы поднять мои запросы о стратегиях извлечения из спящего режима, iЯ рассматриваю приведенный ниже фрагмент кода в моем классе Отдела

  @OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.EAGER,      orphanRemoval = true)
 @Fetch(value = FetchMode.SELECT)
 @BatchSize(size = 10)
 private Set<EmployeeData> employees = new HashSet<EmployeeData>();

Согласно моему пониманию, как только я упоминаю fetchtype как нетерпеливый, у меня остается только стратегия соединения с выборкой, но когда я упоминаю как fetchtype как lazyloading, у менядругие три варианта, например select, batch-size и subselect. Согласовано? Теперь, если я посмотрю на фрагмент кода в одном из моих устаревших проектов, он упомянет тип выборки как eager и стратегию выборки как таковуюлекция, которая противоречит друг другу.Правильно?

Другой запрос Я не вижу параметр размера партии , когда пишу FetchMode.и сделать контроль + пробел в затмении, хотя я вижу другие три стратегии извлечения?

Ответы [ 2 ]

16 голосов
/ 23 января 2012

Hibernate коллекции имеют тип выборки и настройки режима выборки.

Тип извлечения указывает , когда элементы коллекции извлекаются, а режим извлечения указывает , как Hibernate извлекает их.

Итак, FetchMode.SELECT и FetchMode.SUBSELECT допустимы как для FetchType.EAGER, так и FetchType.LAZY. Разница в том, что при FetchType.EAGER дополнительный запрос выбора выполняется немедленно, тогда как при FetchType.LAZY он выполняется после первого доступа к коллекции.

FetchMode.JOIN, однако, не имеет смысла с FetchType.LAZY.

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

Смотри также:

0 голосов
/ 14 апреля 2015

размер партии = N почти равен fetch = subselect .Позвольте мне объяснить вам, как это так:

Предположим, у вас есть 10000 родительских записей, и у каждой из них есть 500 дочерних записей, и если вы используете стратегию выборки как subselect , то вот какзапросы будут выглядеть так:

Подвыбрать:
Выбрать * из родительского элемента;
Выбрать * из дочернего элемента, в котором находится child.Parent_Id (выберите Parent_Id из Parent).

Примечание: На всякий случай, если предложение IN превышает предел, который обеспечивается базовой базой данных, очевидно, что приведенный выше запрос не выполняется.Вот ситуация, когда размер партии входит в картину.Используя пакетный размер , мы можем указать количество идентификаторов Parent_Id для участия в предложении IN.

Select & batch-size:
Select * from parent;
select * from child, где child.Parent_Id in (1,2,3,4 ...... до предела предложения IN базовой БД).
select * from child, где child.Parent_Id in(1001 1002 ...... до предела предложения IN базовой БД).

Примечание: размер партии следует использовать с fetch = select , но не с fetch = subselect (так как это не имеет никакого смысла).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...