LazyInitializationException intermitente

4 respostas
vinny767

Amigos,

Estou com um erro na minha aplicação que acontece “as vezes”. Já dei uma olhada, fuçei, já perdi um bom tempo e até agora nada. O erro que ocorre as vezes é de

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.instituicaol.domain.entity.Usuario.listaDeFilhos, no session or session was closed

Gostaria de saber como fazer com que essa lista de filho seja carregada em modo Eager e não mais Lazy. Segue o mapeamento objeto relacional desta lista:

@ManyToMany
@JoinTable(name="tbl_filhos", joinColumns=@JoinColumn(name="id_usuario", referencedColumnName="id_usuario"),
inverseJoinColumns=@JoinColumn(name="id_filho", referencedColumnName="id_usuario"))
private List<Usuario>  listaDeFilhos = new ArrayList<Usuario>();

Tem como fazer isso? obrigado!

4 Respostas

H

Utilize a propriedade fetch=FetchType.EAGER na anotação @ManyToMany

É isso ae…
valeu

vinny767

Mas não há nenhum tipo de restrição?

Uma vez eu lí que o Eager só poderia ser usado quando o relacionamento terminasse com ONE, ou seja, ManyToOne, OneToOne…
Posso utiliza-lo mesmo terminando com Many?

Valeu

vinny767

Uma outra dúvida…
Eu possuo um objeto Usuario que tem uma lista de Usuarios dentro dele… Algo parecido com

public class Usuario{
   private String nome;
   private String telefone;
   private List<Usuario> listaDeIrmaos;
}

Eu vou até o Banco de dados e recupero um usuario qualquer. A listaDeIrmaos dele vem Lazy, ou seja, sem os dados.
Como eu posso fazer para, em tempo de execução, carregar essa lista? Eu li em uma apostila que devemos invocar uma propriedade da lista para que o Hibernate vá até o BD e recupere os registros, mas não consegui fazer funcionar na pratica.

Valeu

P

Pode sim, o problema é que as vezes fica trazendo mais do que deve e isso pode tornar lento ou algo do genêro, mas é bem difícil. O que vc pode fazer, é dar um .size() antes do retorno apenas pra ‘inicializar’ ela. É uma outra gambiarra que funciona as vezes :smiley:

Criado 6 de maio de 2009
Ultima resposta 6 de mai. de 2009
Respostas 4
Participantes 3