Каков тип выборки по умолчанию в сопоставлениях гибернации?
После исследования я узнал следующее:
- один на один очень хочет .
- для одного ко многим это лениво .
Но после тестирования в Eclipse, все захотели.
Это зависит от того, использую ли я JPA или Hibernate?
Ответы:
Это зависит от того, используете ли вы JPA или Hibernate.
Из спецификации JPA 2.0 , значения по умолчанию:
А в спячке все лениво
ОБНОВИТЬ:
Последняя версия Hibernate соответствует указанным выше значениям JPA по умолчанию.
источник
Я знаю, что ответы были правильными на момент, когда задавался вопрос, но поскольку люди (такие как я в эту минуту) все еще находят, что им интересно, почему их WildFly 10 ведет себя по-другому, я хотел бы дать обновление для текущего Hibernate 5 .x версия:
В Руководстве пользователя Hibernate 5.2 это указано в главе 11.2. Применение стратегий выборки :
Таким образом, Hibernate также ведет себя как Ашиш Агарвал, указанный выше для JPA:
(см. спецификацию JPA 2.1 )
источник
Чтобы ответить на ваш вопрос, Hibernate - это реализация стандарта JPA. Hibernate имеет свои особенности работы, но в соответствии с документами Hibernate
Таким образом, Hibernate всегда будет загружать любой объект, используя стратегию отложенной выборки, независимо от того, какой тип отношений вы объявили. Он будет использовать ленивый прокси (который должен быть неинициализированным, но не нулевым) для одного объекта в отношении один-к-одному или многие-к-одному, а также нулевую коллекцию, которая будет заполнена значениями при попытке доступа к ней. .
Следует понимать, что Hibernate будет пытаться заполнить эти объекты значениями только тогда, когда вы попытаетесь получить доступ к объекту, если вы не укажете
fetchType.EAGER
.источник
Для однозначных ассоциаций, т. Е. «Один-к-одному» и «Многие-к-одному»: -
По умолчанию Lazy = прокси.
Ленивая загрузка прокси : - Это означает, что загружен прокси-объект вашей связанной сущности. Это означает, что для прокси-объекта связанной сущности загружается только идентификатор, соединяющий две сущности.
Например: A и B - это две сущности с ассоциацией "многие к одному". то есть: Там может быть мультипликатора для каждого B. Каждый объект A будет содержать ссылку на B.
`
`
Отношение A будет содержать столбцы (помощь, ставка, ... другие столбцы объекта A).
Отношение B будет содержать столбцы (ставка, ... другие столбцы объекта B).
Прокси подразумевает, что когда A выбирается, для B выбирается только id, и он сохраняется в прокси-объекте B, который содержит только id. Прокси-объект B - это объект прокси-класса, который является подклассом B с минимальными полями. Поскольку ставка уже является частью отношения A, нет необходимости запускать запрос для получения ставки от отношения B. Другие атрибуты объекта B загружаются лениво только при доступе к полю, отличному от ставки.
Для коллекций, то есть «многие-ко-многим» и «один-ко-многим»: -
По умолчанию Lazy = true
Обратите внимание, что стратегия выборки (выбор, присоединение и т. Д.) Может отменять ленивость. то есть: если lazy = 'true' и fetch = 'join', выборка A также приведет к выборке B или B (в случае коллекций). Вы можете понять причину, если задумаетесь.
Выборка по умолчанию для однозначной ассоциации - «соединение».
Выборка по умолчанию для коллекций - «select». Пожалуйста, проверьте последние две строки. Я пришел к логическому выводу.
источник