Какая разница между lazy = "true" и fetch = "select" в спящем режиме?

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

Ответ 1

Да.

Атрибут lazy указывает спящий режим, когда нужно получить дочерние элементы.

Атрибут fetch указывает спящий режим, как получить детей.

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

Леновый = истинный атрибут позволяет ленивую загрузку родительского и дочернего коллекции и одно и то же свойство fetch = "select"

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

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

Ответ 2

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

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

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

Ответ 3

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