Некоторые вопросы относительно стратегий выборки в спящем режиме и связи fetchtype с fetchmode?

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

  1. fetch- ”join” = Отключить ленивую загрузку, всегда загружать все коллекции и объекты.
  2. fetch- ”select” (по умолчанию) = Ленивая загрузка всех коллекций и сущностей.
  3. batch-size = ”N” = Получение до "N" коллекций или объектов, Не записывать.
  4. fetch- ”subslect” = Сгруппировать свою коллекцию в оператор sub select.

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

Чтобы поднять мои вопросы о стратегиях извлечения гибернации, я рассматриваю ниже фрагмент кода в моем классе Департамента

  @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 как ленивую загрузку, у меня есть еще три варианта: выбор, размер пакета и подвыбор. Согласен? < / strong> Теперь, если я посмотрю на фрагмент кода в одном из своих унаследованных проектов, он упомянул тип выборки как активный, а стратегию выборки - как выбор, который сокращает друг друга. Правильно?

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


person M Sach    schedule 23.01.2012    source источник


Ответы (2)


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

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

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

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

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

См. также:

person axtavt    schedule 23.01.2012
comment
Удивительное и быстрое разъяснение - person M Sach; 23.01.2012

batch-size = N почти равно fetch = subslect. Позвольте мне объяснить вам, как это происходит:

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

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

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

Выбрать & размер пакета:
Выберите * от родителя;
выберите * от дочернего элемента, где child.Parent_Id в (1,2,3,4 ...... до IN предел предложения базовой БД).
выберите * from child, где child.Parent_Id in (1001,1002 ...... до ограничения предложения IN базовой БД).

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

person Community    schedule 14.04.2015