Атрибут 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.