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

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

Ответ 1

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

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

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

Ответ 2

"Ленивая загрузка" означает, что объект будет загружен только тогда, когда вы фактически обращаются к объекту в первый раз.

Шаблон выглядит следующим образом:

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

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

В Hibernate вы можете настроить ленивую загрузку коллекции дочерних объектов. фактическая ленивая загрузка затем выполняется внутри методов 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();
}

Ответ 3

Мартин Фаулер определяет шаблон Lazy Load в Шаблоны архитектуры корпоративных приложений как таковой:

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

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

Это не шаблон, характерный для доступа к данным и Hibernate, но он особенно полезен в таких полях, и Hibernate поддерживает ленивую загрузку ассоциаций "один-ко-многим" и одноточечных ассоциаций ( "один-к-одному" и "много- один) также при определенных условиях. Ленивое взаимодействие обсуждается более подробно в главе 19 справочной документации Hibernate 3.0.

Ответ 4

Bydefault lazy loading true.Lazy загрузка означает, что при выполнении запроса select он не попадет в базу данных. Он будет ждать функции getter. Тогда, когда мы этого потребуем, он будет извлекаться из базы данных. например: Вы родитель, у которого есть ребенок с большим количеством игрушек. Но текущая проблема - всякий раз, когда вы называете его (мы предполагаем, что у вас есть мальчик), он приходит к вам со всеми своими игрушками. Теперь это проблема, потому что вы не хотите, чтобы он носил его игрушки все время. Поэтому, являясь родителем логического обоснования, вы идете прямо вперед и определяете игрушки ребенка как ЛАЗИ. Теперь, когда вы его называете, он просто приходит к вам без его игрушек.

Ответ 5

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

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

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

Пример: Если у вас ТАБЛИЦА? 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(), тогда загружаются данные returns.No новый вызов базы данных.

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

Ответ 6

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

Ответ 7

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

Надеюсь, что это поможет:)

Ответ 8

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

Ответ 9

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

Википедия

Ссылка Lazy Loading от hibernate.org

Ответ 10

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

Ленивая инициализация имеет две цели: задержать дорогостоящую операцию, пока она не станет абсолютно необходимой сохраните результат этой дорогостоящей операции, так что вам не нужно будет повторять ее снова

Ответ 11

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

 

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

Ответ 12

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

Ответ 13

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

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

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

Ответ 14

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

Ответ 15

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

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


1. Байт-код > :

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

Выполняется либо во время компиляции, либо выполняется [время загрузки]

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

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

  • В основном плагины maven/ ant

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

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

2. Доверенные

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

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