2012-10-17 17 views
19

mam 2 podmioty Jako rodzic i dziecko jako OneToMany stosunku jakJaki jest pożytek z adnotacją Hibernate @LazyCollection

@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 

} 

więc o to, co jest stosowanie @LazyCollection (LazyCollectionOption.EXTRA) a kiedy nie pojawi się na obrazku, jak na przykład operacja z listą dzieci będzie korzystna?

Odpowiedz

23

EXTRA = .size() i .contains () nie zainicjuje całej kolekcji

TRUE = zainicjować całą kolekcję na Pierwszy dostęp

FAŁSZ = Chętni-Ładowanie

7

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.

Powiązane problemy