Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Escolhendo o fetchType.Lazy

Bom dia tudo bem ?
No projeto screenmatch foi escolhida a estratégia Eager para o relacionamento entre série e episódio:

@OneToMany(mappedBy = "serie", cascade= CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Episodio> episodios=new ArrayList<>();

Mas como ficaria essa classe caso fosse escolhido o lazy? Uma vez que na aula estava gerando uma exception

@OneToMany(mappedBy = "serie", cascade= CascadeType.ALL, fetch = FetchType.Lazy)
    private List<Episodio> episodios=new ArrayList<>();

Fora esse ajuste quais outros seriam necessários?

1 resposta
solução!

Olá Felipe, bom dia! Tudo bem?

Quando você altera o fetch de EAGER para LAZY, o comportamento do carregamento dos dados muda significativamente. Com LAZY, os dados associados (neste caso, os episódios) não são carregados automaticamente quando a entidade principal (a série) é carregada. Eles só serão carregados quando você realmente precisar acessá-los.

No seu exemplo, a alteração ficaria assim:

@OneToMany(mappedBy = "serie", cascade= CascadeType.ALL, fetch = FetchType.LAZY)
private List<Episodio> episodios = new ArrayList<>();

No entanto, ao usar LAZY, é importante estar ciente de que você pode encontrar a exceção LazyInitializationException. Isso geralmente ocorre quando você tenta acessar a coleção episodios fora do contexto de uma transação ativa, como em um ambiente de visualização ou após a sessão do Hibernate ter sido fechada.

Para evitar essa exceção, você pode:

  1. Garantir que a sessão está aberta: Certifique-se de que a sessão do Hibernate está ativa quando você acessa a coleção episodios.

  2. Utilizar JOIN FETCH em consultas: Carregue os dados necessários explicitamente usando JOIN FETCH em suas consultas JPQL. Por exemplo:

    @Query("SELECT s FROM Serie s JOIN FETCH s.episodios WHERE s.id = :id")
    Serie findSerieWithEpisodes(@Param("id") Long id);
    
  3. Open Session in View Pattern: Embora não seja recomendado em todos os casos, você pode usar o padrão "Open Session in View" para manter a sessão aberta durante a renderização da visualização.

Essas são algumas estratégias que você pode adotar ao utilizar LAZY para evitar problemas com LazyInitializationException.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.