Sobes.tech
Junior — Middle

Consegues descrever um problema relacionado com o carregamento preguiçoso de sessões no JPA?

sobes.tech IA

Resposta da IA

O problema do carregamento preguiçoso (lazy loading) de sessões no JPA está relacionado com o facto de as entidades relacionadas serem carregadas a partir do banco de dados apenas na primeira vez que são acedidas, e não imediatamente ao carregar a entidade principal. Se a sessão (EntityManager) for fechada antes de se aceder aos dados carregados de forma preguiçosa, ao tentar aceder a eles ocorre uma exceção LazyInitializationException.

Por exemplo, se tiver uma entidade Order com uma coleção preguiçosa items, e carregar o pedido numa função, e depois fechar a sessão, ao tentar obter order.getItems() fora da sessão, obterá um erro.

Para evitar este problema, pode:

  • Utilizar carregamento ansioso (EAGER), se for justificado.
  • Abrir a sessão durante o tempo de trabalho com os objetos (Open Session in View).
  • Inicializar explicitamente as coleções preguiçosas dentro da sessão, por exemplo, chamando Hibernate.initialize().

Exemplo:

Order order = entityManager.find(Order.class, id);
Hibernate.initialize(order.getItems()); // inicialização dentro da sessão
entityManager.close();
// Agora pode aceder com segurança a order.getItems()