Jest rzeczywiście nie ma powodu, aby użyć @LazyCollection
.
W TRUE
i FALSE
wartości nie są potrzebne, ponieważ to samo zachowanie może być pobrany z JPA FetchType.LAZY
lub FetchType.EAGER
.
Wartość EXTRA
nie ma odpowiednika w JPA i została zaprojektowana dla bardzo dużych kolekcji. Gdy po raz pierwszy uzyskujesz dostęp do leniwej kolekcji EXTRA
, kolekcja nie jest całkowicie załadowana, jak to zwykle ma miejsce w przypadku każdej kolekcji JPA.
Zamiast tego, każdy element jest pobierany jeden po drugim, przy użyciu drugiego rzędu: SELECT
. Może to brzmieć jak optymalizacja, ale nie jest tak dlatego, że leniwe kolekcje są podatne na N+1 query issues.
Należy zauważyć, że działa to tylko w przypadku zamówionych kolekcji, albo List
(s), które są opatrzone przypisami @OrderColumn
lub Map
(s). W przypadku toreb (na przykład regularnych List
(s) podmiotów, które nie zachowują żadnej określonej kolejności), @LazyCollection(LazyCollectionOption.EXTRA)
zachowuje się jak każda inna kolekcja LAZY
(kolekcja jest pobierana całkowicie po uzyskaniu dostępu po raz pierwszy).
Jeśli masz bardzo dużą kolekcję, nie powinieneś jej wcale mapować. Zamiast tego należy odwzorować tylko stronę @ManyToOne
, a zamiast kolekcji po stronie nadrzędnej należy użyć paginowanego zapytania JPQL.
Zapytania JPQL są łatwiejsze do strojenia, ponieważ można zastosować dowolne kryteria filtrowania i można dokonać paginacji zestawu wyników.