Иногда у вас есть две сущности, и между ними существует взаимосвязь. Например, у вас может быть сущность с именем University и другая сущность с именем Student, а в университете может быть много студентов:
Объект University может иметь некоторые базовые свойства, такие как id, имя, адрес и т.д., А также свойство коллекции students, которое возвращает список студентов для данного университета:
Теперь, когда вы загружаете университет из базы данных, JPA загружает для вас его поля id, name и address . Но у вас есть два варианта загрузки студентов.:
Чтобы загрузить его вместе с остальными полями (т. е. с нетерпением), или
Загружать его по требованию (т. Е. Лениво) при вызове метода university getStudents().
Когда в университете много студентов, неэффективно загружать всех его студентов вместе с ним, особенно когда они не нужны, и в подобных случаях вы можете объявить, что хотите, чтобы студенты загружались тогда, когда они действительно нужны. Это называется отложенной загрузкой.
Вот пример, где students явно помечено для быстрой загрузки:
EAGER загрузка коллекций означает, что они извлекаются полностью в момент получения их родительского элемента. Итак, если у вас есть Course и у него есть List<Student>, все учащиеся извлекаются из базы данных во время выборки Course.
LAZY с другой стороны, это означает, что содержимое List извлекается только при попытке получить к ним доступ. Например, путем вызова course.getStudents().iterator(). Вызов любого метода доступа в List инициирует вызов базы данных для извлечения элементов. Это реализуется путем создания прокси вокруг List (или Set). Итак, для ваших ленивых коллекций конкретными типами являются не ArrayList и HashSet, а PersistentSet и PersistentList (или PersistentBag)
Ответ 4
Основное различие между двумя типами выборки заключается в моменте, когда данные загружаются в память. Я прикрепил 2 фотографии, чтобы помочь вам понять это.