org.hibernate.LazyInitializationException

Olá senhores, boa tarde.

Recebi uma exceção num código legado:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.aplicativoX.pacoteY.domain.classeA.parametrosTipo, no session or session was closed.

na classeA, o parâmetrosTipo está:

@OneToMany(mappedBy = "classeA", fetch = FetchType.LAZY)
private List<ParametroTipo> parametrosTipo;

Pesquisando pela internet, vi recomendarem trocar de Lazy para Eager e também adicionar @Transacional (para tentar manter a sessão aberta).

A primeira solução eu vi que não é recomendada, porque poderá carregar mais objetos de uma só vez do que o prudente; e a segunda solução o código não aceita. Ele dá:

"The annotation @Transactional is disallowed for this location"

Também não dá pra fazer simplesmente “lazy = false”.

============

O que vocês sugerem?

Obrigado.

1 curtida

Na hora de consultar a entidade, você pode fazer um LEFT JOIN FETCH com parametrosTipo, para forçar que essa lista seja preenchida. Ou então usar um @NamedEntityGraph.

Ambos estão descritos aqui - aliás, esse link também explica porque não é uma boa usar o Eager ou uma nova transação, além de dar uma terceira opção de solução: usar DTO projection. Veja qual se aplica melhor ao seu caso.

1 curtida