В чем разница между lazy = "true" и fetch = "select" в спящем режиме? - PullRequest
12 голосов
/ 21 марта 2012

Атрибут lazy=true включает отложенную загрузку родительских и дочерних коллекций и атрибут fetch="select". Есть ли разница между lazy="true" и fetch="select" в спящем режиме?.

Ответы [ 3 ]

21 голосов
/ 21 марта 2012

Да.

Атрибут lazy сообщает hibernate когда , чтобы получить детей.

Атрибут fetch сообщает hibernate , как получить детей.

Когда вы говорите

Атрибут lazy = true включает отложенную загрузку родительского и дочернего элементов. коллекции и та же вещь fetch = "select" атрибут

это неверно. Стратегия выбора выборки - это НЕ то же самое, что отключение отложенной загрузки. На самом деле из документации

Выбрать выборку: второй SELECT используется для извлечения связанных сущность или коллекция. Если вы явно не отключите ленивую выборку указав lazy = "false", этот второй выбор будет выполняться только тогда, когда Вы получаете доступ к ассоциации.

14 голосов
/ 17 июня 2012

Когда мы говорим fetch="select", тогда он всегда будет запускать отдельные запросы для извлечения объектов ассоциации, даже если это lazy ="false".

Но когда мы говорим lazy ="true", это означает, что он получитобъекты ассоциации в отдельном запросе, но не во время загрузки объекта, а при первом обращении к ассоциации.Мы можем сделать это, сказав list().size().

Когда мы скажем fetch="join", он всегда будет запускать один запрос для получения объектов ассоциации из базы данных.

1 голос
/ 29 октября 2015

Чтобы решить n + 1 проблему выбора для n запросов (отношения родитель-потомок) в спящем режиме, мы используем fetch = "join" вместо fetch = "select". Параметр Lazy решает, следует ли загружать дочерние объекты при загрузке родительского объекта. Вам необходимо сделать этот параметр соответствующим файлом отображения гибернации родительского класса. Lazy = true (означает не загружать дочерние объекты). По умолчанию отложенная загрузка дочерних объектов имеет значение true. .

...