Вопрос-ответ

Difference between FetchType LAZY and EAGER in Java Persistence API?

Разница между FetchType LAZY и EAGLE в Java Persistence API?

В чем разница между FetchType.LAZY и FetchType.EAGER в Java Persistence API?

Переведено автоматически
Ответ 1

Иногда у вас есть две сущности, и между ними существует взаимосвязь. Например, у вас может быть сущность с именем University и другая сущность с именем Student, а в университете может быть много студентов:

Объект University может иметь некоторые базовые свойства, такие как id, имя, адрес и т.д., А также свойство коллекции students, которое возвращает список студентов для данного университета:

В университете много студентов

public class University {
private String id;
private String name;
private String address;
private List<Student> students;

// setters and getters
}

Теперь, когда вы загружаете университет из базы данных, JPA загружает для вас его поля id, name и address . Но у вас есть два варианта загрузки студентов.:


  1. Чтобы загрузить его вместе с остальными полями (т. е. с нетерпением), или

  2. Загружать его по требованию (т. Е. Лениво) при вызове метода university getStudents().

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

Вот пример, где students явно помечено для быстрой загрузки:

@Entity
public class University {

@Id
private String id;

private String name;

private String address;

@OneToMany(fetch = FetchType.EAGER)
private List<Student> students;

// etc.
}

И вот пример, где students явно помечено для ленивой загрузки:

@Entity
public class University {

@Id
private String id;

private String name;

private String address;

@OneToMany(fetch = FetchType.LAZY)
private List<Student> students;

// etc.
}
Ответ 2

В основном,

LAZY = fetch when needed
EAGER = fetch immediately
Ответ 3

EAGER загрузка коллекций означает, что они извлекаются полностью в момент получения их родительского элемента. Итак, если у вас есть Course и у него есть List<Student>, все учащиеся извлекаются из базы данных во время выборки Course.

LAZY с другой стороны, это означает, что содержимое List извлекается только при попытке получить к ним доступ. Например, путем вызова course.getStudents().iterator(). Вызов любого метода доступа в List инициирует вызов базы данных для извлечения элементов. Это реализуется путем создания прокси вокруг List (или Set). Итак, для ваших ленивых коллекций конкретными типами являются не ArrayList и HashSet, а PersistentSet и PersistentList (или PersistentBag)

Ответ 4

Основное различие между двумя типами выборки заключается в моменте, когда данные загружаются в память.
Я прикрепил 2 фотографии, чтобы помочь вам понять это.

Eager fetch

 Eager fetch

Отложенная выборка Отложенная выборка

java hibernate jpa