Ответ 1
Чтобы дать вам подсказку, в основном по соображениям производительности, вы можете начать читать следующие ссылки:
У меня есть 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) и когда оно появится на картинке, например, для какой операции с дочерним списком, это будет полезно?
Чтобы дать вам подсказку, в основном по соображениям производительности, вы можете начать читать следующие ссылки:
EXTRA =.size() и .contains() не будут инициализировать всю коллекцию
ИСТИНА= инициализировать всю коллекцию при первом доступе
ЛОЖЬ= Eager-Loading
На самом деле нет причин использовать @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 гораздо проще настраивать, так как вы можете применять любые критерии фильтрации, и вы можете разбивать результирующий набор.