it-roy-ru.com

Что такое ленивая загрузка в Hibernate?

Что такое ленивая загрузка в Java? Я не понимаю процесс. Кто-нибудь может помочь мне понять процесс ленивой загрузки?

161
rocker

Скажем, у вас есть родитель, и у этого родителя есть коллекция детей. Hibernate теперь может «лениво загружать» дочерние элементы, что означает, что он фактически не загружает все дочерние элементы при загрузке родительского элемента. Вместо этого он загружает их по запросу. Вы можете запросить это явно или, что гораздо чаще, hibernate будет загружать их автоматически при попытке доступа к дочернему элементу.

Lazy-loading может помочь значительно улучшить производительность, так как часто дети вам не нужны, и поэтому они не будут загружены.

Также остерегайтесь проблемы n + 1. Hibernate не будет загружать все дочерние элементы при доступе к коллекции. Вместо этого он будет загружать каждого ребенка в отдельности. Итерируя по коллекции, это вызывает запрос для каждого дочернего элемента. Чтобы избежать этого, вы можете обмануть спящий режим, загружая всех детей одновременно, например, вызывая parent.getChildren (). size ().

255
Thomas Lötzer

«Ленивая загрузка» означает, что сущность будет загружена только, когда вы фактически обращаетесь к сущности в течение first времени.

Шаблон выглядит так:

public Entity getEntity() {
    if (entity == null) {
        entity = loadEntity();
    }
    return entity;
}

Это экономит затраты на предварительную загрузку/предварительное заполнение всех сущностей в большом наборе данных заранее, в то время как вам на самом деле не нужны все из них.

В Hibernate вы можете настроить ленивую загрузку коллекции дочерних объектов. Ленивая загрузка actual выполняется внутри методов PersistentSet , которые Hibernate использует «под капотами», чтобы назначить коллекцию сущностей как Set.

Например.

public class Parent {
    private Set<Child> children;

    public Set<Child> getChildren() {
        return children;
    }
}

,.

public void doSomething() {
    Set<Child> children = parent.getChildren(); // Still contains nothing.

    // Whenever you call one of the following (indirectly), 
    // Hibernate will start to actually load and fill the set.
    children.size();
    children.iterator();
}
70
BalusC

Мартин Фаулер определяет Lazy Load pattern in Patterns of Enterprise Application Architecture как таковой:

Объект, который не содержит всех необходимых вам данных, но знает, как их получить.

Таким образом, при загрузке данного объекта идея состоит в том, чтобы не стремиться загрузить связанный объект (ы), который вы не можете использовать немедленно, чтобы сэкономить связанные с этим затраты производительности. Вместо этого связанный объект (ы) будет загружен только при использовании. 

Это не шаблон, специфичный для доступа к данным и Hibernate, но он особенно полезен в таких областях, и Hibernate поддерживает ленивую загрузку ассоциаций «один ко многим» и ассоциаций «один к одному» и «многие к одному». при определенных условиях. Ленивое взаимодействие более подробно обсуждается в Глава 19 Справочной документации по Hibernate 3.0. 

24
Pascal Thivent

По умолчанию отложенная загрузка имеет значение true. Ленивая загрузка означает, что при выполнении запроса select он не попадет в базу данных. Он будет ждать функции получения, т.е. когда нам потребуется, он будет извлекать из базы данных . Например: Вы - родитель, у которого есть ребенок с большим количеством игрушек. Но текущая проблема заключается в том, что когда вы звоните ему (мы предполагаем, что у вас есть мальчик), он приходит к вам со всеми своими игрушками. Теперь это проблема, так как вы не хотите, чтобы он все время носил с собой свои игрушки…. Таким образом, будучи обоснованным родителем, вы идете прямо вперед и определяете игрушки ребенка как ЛЕНИЦЫ. Теперь, когда бы ты ни позвонил ему, он просто приходит к тебе без игрушек.

15
Chandresh Solanki

Ленивая выборка решает, загружать ли дочерние объекты при загрузке родительского объекта. Вам нужно сделать эту настройку для соответствующего файла отображения hibernate родительского класса. Lazy = true (означает не загружать дочерние) По умолчанию отложенная загрузка дочерних объектов выполняется. 

Это гарантирует, что дочерние объекты не загружаются, если они не были явно вызваны в приложении путем вызова метода getChild() для parent. В этом случае hibernate выдает новый вызов базы данных, чтобы загрузить дочерний объект, когда getChild() фактически вызывается для родительского объекта.

Но в некоторых случаях вам нужно загрузить дочерние объекты, когда родительский загружен. Просто сделайте lazy = false, и hibernate загрузит дочерний элемент при загрузке parent из базы данных.

Пример: Если у вас есть СТОЛ? EMPLOYEE отображается на объект Employee и содержит набор объектов Address. Родительский класс: класс сотрудника, Дочерний класс: класс адреса 

public class Employee { 
private Set address = new HashSet(); // contains set of child Address objects 
public Set getAddress () { 
return address; 
} 
public void setAddresss(Set address) { 
this. address = address; 
} 
} 

В файле Employee.hbm.xml 

<set name="address" inverse="true" cascade="delete" lazy="false"> 
<key column="a_id" /> 
<one-to-many class="beans Address"/> 
</set> 

В приведенной конфигурации. Если lazy="false": - при загрузке объекта Employee в это время также загружается дочерний объект Address и устанавливается метод setAddresss (). Если вы вызываете employee.getAdress (), то загруженные данные возвращаются. Нет нового вызова базы данных. 

Если lazy="true": - это конфигурация по умолчанию. Если вы не упоминаете, то в спящем режиме считайте lazy = true. при загрузке объекта Employee дочерний объект Adress того времени не загружается. Вам нужен дополнительный вызов в базу данных, чтобы получить адресные объекты. Если вы вызываете employee.getAdress(), то запрос времени к базе данных запускается и возвращает результаты. Свежий вызов базы данных.

11
Bhavin Shah

На языке непрофессионала, это как будто вы делаете торт, и вам понадобится 5-10 ингредиентов из холодильника. У вас есть два варианта: взять все ингредиенты из холодильника и поставить их на кухонную платформу, или принести предмет, который вам нужен, когда вам нужно.

Точно так же при активной загрузке вы извлекаете всю информацию о бобе и связанных с ним классах (не дочерних или не-связанных, но имеющих отношение, т. Е. В торте есть мука, есть молоко, есть сливки и т.д.), А в случае отложенной загрузки сначала Вы приносите только его идентификатор и значения из той же таблицы (необходимые ингредиенты, которые вам сначала понадобятся в вашей миске в случае торта). Вся информация, поступающая из других таблиц, будет выбираться по мере необходимости/при необходимости.

8
Keyur

Ленивая загрузка? Ну, это просто означает, что дочерние записи выбираются не сразу, а автоматически, как только вы пытаетесь получить к ним доступ.

8
Steffen

Параметр Lazy решает, следует ли загружать дочерние объекты при загрузке родительского объекта. Вам необходимо сделать этот параметр соответствующим файлом отображения гибернации родительского класса. Lazy = true (означает не загружать дочерние объекты). По умолчанию отложенная загрузка дочерних объектов имеет значение true. , Это гарантирует, что дочерние объекты не загружаются, если они явно не вызваны в приложении путем вызова метода getChild () для parent. В этом случае hibernate выдает новый вызов базы данных, чтобы загрузить дочерний объект, когда getChild () фактически вызывается для Parent object.But в некоторых случаях вам нужно загрузить дочерние объекты, когда родительский загружен. Просто сделайте lazy = false, и hibernate загрузит дочерний элемент, когда родительский объект загружен из базы данных. Exampleslazy = true (по умолчанию). Дочерний адрес класса User может быть сделан ленивым, если он не требуется часто. Автор объекта для книги «Родитель» всякий раз, когда вы имеете дело с книгой для интернет-магазина книг.

3
Siva Chimpiri

Ленивая загрузка - это шаблон дизайна обычно используется в компьютерном программировании отложить инициализацию объекта до точки, в которой это необходимо . Это может способствовать эффективности в работа программы, если правильно и правильно используется 

Википедия

Ссылка Ленивая загрузка с hibernate.org

2
Diego Dias

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

0
Abhinaya Pandey

Ленивая загрузка позволяет отложить поиск ассоциации или лучше контролировать стратегию извлечения.

Когда вы используете загрузку EAGER, вы определяете глобальный план выборки, который не может быть переопределен во время запроса, то есть вы ограничены решением, которое вы приняли при разработке вашей модели сущности. Выборка EAGER - это запах кода , потому что стратегия выборки - это политика времени запроса, и она может отличаться в зависимости от варианта использования в бизнесе.

Стратегия fetching является очень важным аспектом, так как слишком большая загрузка EAGER может вызвать серьезные проблемы с производительностью.

0
Vlad Mihalcea

Hiberante поддерживает функцию отложенной инициализации как для сущностей, так и для коллекций Механизм Hibernate загружает только те объекты, которые мы запрашиваем, но не другие энтиты или коллекции.

 

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

0
abburi

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

0
Manikandan Adhimoolam

Удивительно, но ни один из ответов не говорит о том, как это достигается спящим режимом за экранами.

Lazy loading - это шаблон проектирования, который эффективно используется в спящем режиме по соображениям производительности, включающим следующие методы.


1. Инструментарий байт-кода

Расширяет определение базового класса с помощью hibernate hooks для перехвата всех вызовов этого объекта.

Сделано либо во время компиляции, либо во время загрузки [load]

1.1 Время компиляции

  • Операция после компиляции

  • В основном с помощью плагинов maven/ant

1.2 Время выполнения

  • Если инструментарий во время компиляции не выполняется, он создается во время выполнения Использование таких библиотек, как javassist

2. Прокси

Объект-сущность, возвращаемый Hibernate, является прокси реального типа.

Смотрите также: Javassist. Какова основная идея и где реальное использование?

0
Sankarganesh Eswaran