CodeGym/Cursos Java/All lectures for PT purposes/Carregamento lento ao mapear coleções

Carregamento lento ao mapear coleções

Disponível

2.1 opção de busca

Os desenvolvedores do Hibernate sabem do problema de carregar entidades filhas há muito tempo. Portanto, a primeira coisa que eles fizeram foi adicionar um parâmetro de busca especial às anotações @OneToMany, @ManyToMany.

Este parâmetro pode assumir dois valores:

  • ANSIOSO
  • PREGUIÇOSO

Exemplo:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")

Se o parâmetro de busca for igual a EAGER , quando a entidade pai for carregada, todas as suas entidades filhas também serão carregadas. Além disso, o Hibernate tentará fazer isso em uma consulta SQL, gerando uma consulta pesada e obtendo todos os dados de uma vez.

Se o parâmetro de busca tiver o valor LAZY , quando a entidade pai for carregada, a entidade filha não será carregada. Em vez disso, um objeto proxy será criado.

Com a ajuda deste objeto proxy, o Hibernate irá rastrear o acesso a esta entidade filha e carregá-la na memória na primeira vez que for acessada.

Se recordarmos nossa situação com comentários:

@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
   @JoinColumn(name = "user_id")
   public List<Comment> comments;
}

Então você tem uma “escolha chique”:

Se fetch = FetchType.EAGER, o Hibernate carregará todos os comentários na 1ª linha do código:

User user = session.get(User.class, 1);		//load all comments here
List<Comment> comments = user.getComments();

Se fetch = FetchType.LAZY, o Hibernate carregará todos os comentários na 2ª linha do código:

User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here

Como você já pode imaginar, você não tem opção quando não carrega todos os comentários :)

2.2 Valor padrão

Se você não especificar uma opção de busca para a @ManyToanotação ..., o Hibernate usará os valores padrão.

Eles são ligeiramente diferentes para diferentes tipos de anotação. Para anotações @OneToOnee @ManyToOneé EAGER, para anotações @OneToManye @ManyToManyé PREGUIÇOSO. É fácil lembrar - se nos referirmos a um objeto, ele será carregado completamente. Se nos referirmos a uma coleção, ela será carregada na primeira vez em que for acessada.

2.3 Anotação @LazyCollection

Como você já viu, o parâmetro fetch não ajuda muito ao trabalhar com coleções. Os criadores do Hibernate tentaram consertar isso adicionando uma anotação especial @LazyCollection. Geralmente é escrito assim:

@LazyCollection(LazyCollectionOption.TRUE)

Você precisa especificá-lo ao mapear os campos da coleção:

@Entity
@Table(name="user")
class User {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.TRUE)
   public List<Comment> comments;
}

Esta anotação tem um parâmetro de valor que pode assumir um dos três valores:

  • LazyCollectionOption. verdadeiro
  • LazyCollectionOption. FALSO
  • LazyCollectionOption. EXTRA

As duas primeiras opções são muito semelhantes à opção de busca.

Se o parâmetro estiver definido como LazyCollectionOption.TRUE, significa que os valores do campo comentários não serão carregados do banco de dados quando o objeto pai User for carregado. Objetos do tipo Comentário serão carregados na primeira vez que o campo de comentários for acessado. Na verdade, isso é o equivalente ao parâmetroFetchType.LAZY

Se o parâmetro estiver definido como LazyCollectionOption.FALSE, significa que os valores do campo comentários serão carregados do banco de dados no momento do carregamento do objeto pai Usuário. Objetos do tipo Comentário serão carregados na primeira vez que o campo de comentários for acessado. Na verdade, isso é o equivalente ao arquivo FetchType.EAGER.

Comentários
  • Populares
  • Novas
  • Antigas
Você precisa acessar para deixar um comentário
Esta página ainda não tem nenhum comentário