Подтвердить что ты не робот

Какая польза от аннотации Hibernate @LazyCollection

У меня есть 2 объекта как родительское и дочернее как отношение OneToMany как

@Entity
public class Parent {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String name;

@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
@IndexColumn(name = "index", base = 1)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@LazyCollection(LazyCollectionOption.EXTRA)
private List<Child> childs = new ArrayList<Child>();
// getter and setter

}

Итак, что такое использование @LazyCollection (LazyCollectionOption.EXTRA) и когда оно появится на картинке, например, для какой операции с дочерним списком, это будет полезно?

4b9b3361

Ответ 1

Чтобы дать вам подсказку, в основном по соображениям производительности, вы можете начать читать следующие ссылки:

Кэш второго уровня

Hibernate Documentation

Ответ 2

EXTRA =.size() и .contains() не будут инициализировать всю коллекцию

ИСТИНА= инициализировать всю коллекцию при первом доступе

ЛОЖЬ= Eager-Loading

Ответ 3

На самом деле нет причин использовать @LazyCollection.

Значения TRUE и FALSE не нужны, поскольку такое же поведение можно получить с помощью JPA FetchType.LAZY или FetchType.EAGER.

Значение EXTRA не имеет эквивалента в JPA и предназначено для очень больших коллекций. Когда вы впервые входите в коллекцию EXTRA lazy collection, коллекция не полностью загружена, как это обычно бывает в любой коллекции JPA.

Вместо этого каждый элемент выбирается один за другим, используя вторичный SELECT. Это может показаться оптимизацией, но это не потому, что EXTRA ленивые коллекции склонны к проблемам с N + 1.

Обратите внимание, что это работает только для упорядоченных коллекций, либо List (s), которые аннотируются с помощью @OrderColumn или Map (s). Для мешков (например, регулярных List (s) объектов, которые не сохраняют какой-либо определенный порядок), @LazyCollection( LazyCollectionOption.EXTRA ) ведет себя точно так же, как и любая другая коллекция LAZY (коллекция извлекается полностью после первого обращения).

Если у вас очень большая коллекция, вы не должны ее отображать. Вместо этого вы должны отображать только сторону @ManyToOne, и вместо коллекции с родительской стороной вы должны использовать разбитый на страницы JPQL-запрос.

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