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:
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.
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);
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 ✓.