Подтвердить что ты не робот

Тип выборки по умолчанию для одного-к-одному, много-к-одному и один-ко-многим в спящем режиме

Что такое тип выборки по умолчанию в спящих сопоставлениях?

Что я узнал после изучения:

  • для одного к одному он нетерпелив.
  • для одного-ко-многим это ленивый.

Но после тестирования в Eclipse все было в восторге.

Зависит ли от использования JPA или Hibernate?

4b9b3361

Ответ 1

Это зависит от того, используете ли вы JPA или Hibernate.

Из спецификации JPA 2.0 значения по умолчанию:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

А в спящем режиме все ленивые

ОБНОВИТЬ:

Последняя версия Hibernate соответствует вышеуказанным стандартным настройкам JPA.

Ответ 2

Я знаю, что ответы были правильными во время запроса вопроса, но поскольку люди (как и я в эту минуту) все еще не обнаружили, что они задаются вопросом, почему их WildFly 10 ведет себя по-другому, я хотел бы дать обновление для текущая версия Hibernate 5.x:

В Hibernate 5.2. Руководство пользователя указано в главе 11.2. Применение стратегий выборки:

Рекомендация Hibernate состоит в том, чтобы статически отмечать все ассоциации ленив и использовать динамические стратегии отбора для рвения. Это к сожалению, противоречит спецификации JPA, которая определяет, что все индивидуальные и многозначные ассоциации должны быть с нетерпением по умолчанию. Hibernate, как поставщик JPA, чтит это значение по умолчанию.

Итак, Hibernate также ведет себя как Ashish Agarwal, заявленный выше для JPA:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

(см. JPA 2.1 Spec)

Ответ 3

Чтобы ответить на ваш вопрос, Hibernate - это реализация стандарта JPA. Hibernate имеет свои собственные приемы работы, но согласно Hibernate docs

По умолчанию Hibernate использует ленивый выбор для наборов и ленивый выбор прокси для однозначных ассоциаций. Эти значения по умолчанию имеют смысл для большинства ассоциаций в большинстве приложений.

Таким образом, Hibernate всегда будет загружать любой объект, используя ленивую стратегию выбора, независимо от того, какой тип отношений вы заявили. Он будет использовать ленивый прокси (который должен быть неинициализирован, но не равен нулю) для одного объекта в отношениях "один к одному" или "один к одному" и нулевой набор, который будет гидратировать со значениями при попытке получить к нему доступ,

Следует понимать, что Hibernate будет пытаться заполнить эти объекты значениями при попытке доступа к объекту, если вы не укажете fetchType.EAGER.

Ответ 4

Для однозначных ассоциаций, т.е. один-к-одному и много-к-одному: -
По умолчанию Lazy = proxy
Прокси ленивая загрузка: - Это означает, что загружается прокси-объект связанного объекта. Это означает, что для прокси-объекта связанного объекта загружается только идентификатор, соединяющий два объекта.
Например: A и B являются двумя объектами с множеством к одной ассоциации. т.е.: для каждого B. может быть несколько A. Каждый объект A будет содержать ссылку B.
`

public class A{
    int aid;
    //some other A parameters;
    B b;
}
public class B{
    int bid;
     //some other B parameters;
}

`
Отношение A будет содержать столбцы (помощь, ставка,... другие столбцы объекта A).
Отношение B будет содержать столбцы (ставки,... другие столбцы объекта B)
Прокси подразумевает, что при выборе A, для B выбирается только id и сохраняется в прокси-объекте B, который содержит только id. Объект прокси B - это объект прокси-класса, который является подклассом B с минимальными полями. Поскольку ставка уже является частью отношения A, нет необходимости запускать запрос, чтобы получить ставку из отношения B. Другие атрибуты объекта B лениво загружаются только тогда, когда доступно поле, отличное от ставки.

Для коллекций, т.е. "многие-ко-многим" и "один ко многим": -
По умолчанию Lazy = true


Также обратите внимание, что стратегия выборки (select, join и т.д.) Может переопределить ленивый. т.е.: если lazy = 'true' и fetch = 'join', выборка A также будет извлекать B или Bs (в случае коллекций). Вы можете получить причину, если подумаете об этом.
Default fetch для однозначной ассоциации - "join".
По умолчанию для коллекции выбрана опция "select". Проверьте последние две строки. Я логически это сделал.