Qual é o uso da anotação @LazyCollection do Hibernate?

Eu tenho duas entidades como pai e filho como OneToMany relação como

@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 childs = new ArrayList(); // getter and setter } 

Então, aqui o que é o uso de @LazyCollection (LazyCollectionOption.EXTRA) e quando virá na imagem, como para qual operação com lista de filhos, será benéfico?

Para dar uma dica, é principalmente por motivos de desempenho que você pode começar a ler os seguintes links:

Cache de segundo nível

Documentação de hibernação

EXTRA = .size () e .contains () não inicializarão toda a coleção

TRUE = inicializa a coleção inteira no primeiro access

FALSO = Carregamento Rápido

Na verdade, não há motivo para usar @LazyCollection .

Os valores TRUE e FALSE não são necessários, pois o mesmo comportamento pode ser obtido com o JPA FetchType.LAZY ou FetchType.EAGER .

O valor EXTRA não tem equivalente em JPA e foi projetado para collections muito grandes. Quando você acessa uma coleção preguiçosa EXTRA pela primeira vez, a coleção não é totalmente carregada, como é geralmente o caso com qualquer coleção JPA.

Em vez disso, cada elemento é buscado um por um, usando um SELECT secundário. Isso pode soar como uma otimização, mas não é porque as collections preguiçosas EXTRA são propensas a problemas com consultas N + 1 .

Observe que isso funciona apenas para collections ordenadas, seja List (s) anotadas com @OrderColumn ou Map (s). Para malas (por exemplo, List (s) regular (is) de entidades que não preservam determinada ordenação), a @LazyCollection( LazyCollectionOption.EXTRA ) se comporta como qualquer outra coleção LAZY (a coleção é buscada inteiramente ao ser acessada pela primeira vez).

Se você tiver uma coleção muito grande, não deverá mapeá-la. Em vez disso, você deve mapear apenas o lado @ManyToOne e, em vez de uma coleção do lado pai, deve usar uma consulta JPQL paginada.

As consultas JPQL são muito mais fáceis de ajustar porque você pode aplicar qualquer critério de filtragem e pode paginar o conjunto de resultados.