java prevent Qual è l'uso dell'annotazione Hibernate @LazyCollection




spring boot fetch lazy (3)

Non c'è in realtà alcun motivo per usare @LazyCollection .

I valori TRUE e FALSE non sono necessari poiché è possibile ottenere lo stesso comportamento con JPA FetchType.LAZY o FetchType.EAGER .

Il valore EXTRA non ha equivalenti in JPA ed è stato progettato per collezioni molto grandi. Quando accedi a una raccolta lenta EXTRA per la prima volta, la raccolta non è interamente caricata, come di solito accade con qualsiasi raccolta JPA.

Invece, ogni elemento viene recuperato uno per uno, utilizzando un SELECT secondario. Questo potrebbe sembrare un'ottimizzazione, ma non è perché le collezioni pigri EXTRA sono soggette a problemi di query N + 1 .

Si noti che questo funziona solo per raccolte ordinate, entrambe le List annotate con @OrderColumn o Map (s). Per le borse (ad esempio List regolari di entità che non conservano alcun ordine specifico), @LazyCollection( LazyCollectionOption.EXTRA ) si comporta come qualsiasi altra raccolta LAZY (la raccolta viene recuperata interamente al momento dell'accesso per la prima volta).

Se hai una collezione molto grande, non dovresti mapparla affatto. Invece, dovresti mappare solo il lato @ManyToOne e, invece di una raccolta sul lato genitore, dovresti usare una query JPQL impaginata.

Le query JPQL sono molto più semplici da ottimizzare perché puoi applicare qualsiasi criterio di filtro e puoi impaginare il set di risultati.

Ho 2 entità come Parent e Child come OneToMany come relazione

@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

}

Quindi, che cosa è l'uso di @LazyCollection (LazyCollectionOption.EXTRA) e quando verrà visualizzato in un'immagine, come per quale operazione con l'elenco secondario , sarà utile?


EXTRA = .size () e .contains () non inizializzeranno l'intera raccolta

TRUE = inizializza l'intera raccolta al primo accesso

FALSE = Eager-Loading






lazy-loading