Swing + LazyInitializationException

5 respostas
daniel9c

Ja fui na pesquisa do fórum porem nao consegui resolver meu problema:
Tenha uma aplicação swing + hibernate.

Tenho uma classe Pessoa onde os enderecos relacionados com a pessoa estão mapeados assim:

@OneToMany(mappedBy="pessoa", cascade=CascadeType.ALL)
private List<Endereco> enderecos;

Faco um select com criteria:

Criteria criPesquisa = criteria(Pessoa.class);
//carregando os enderecos para evitar LazyException
criPesquisa.setFetchMode("enderecos", FetchMode.JOIN); 
return criPesquisa.list();

Ok na view eu consigo acessar os enderecos das pessoa e colocar em uma grid.

Mas ocorre um erro se eu tentar fazer um filtro:

Criteria criPesquisa = criteria(Pessoa.class);
//carregando os enderecos para evitar LazyException
criPesquisa.setFetchMode("enderecos", FetchMode.JOIN); 

criPesquisa.createAlias("enderecos", "end");                        
criPesquisa.add(Restrictions.like(("end.complemento"), (filtro), MatchMode.ANYWHERE).ignoreCase());

return criPesquisa.list();

Erro: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: projeto.dominio.Pessoa.enderecos, no session or session was closed.

Alguem pode me ajudar?

5 Respostas

ignacio83

Sua Sessão está aberta?

daniel9c

nao, na hora de pegar os resultados da lista a sessao fica fechada, eu gostaria de carregar tudo na lista para que nao precise ficar com a sessao aberta, por isso eu uso o JOIN.
Será que o problema nao seja porque enderecos é uma Lista, e eu estou tentando dar um like em uma propriedade dentro de uma lista?

ignacio83

Acredito que não seja possível filtrar sem a sessão estar aberta… Nunca fiz isso…

Porém tente utilizar esse método após a consulta inicial:

Hibernate.initialize(Object obj)
daniel9c

ta nao entendi o que eu coloco dentro Hibernate.initialize(???) ?
olha eu consigo resolver o problema com esta gambi aqui

List<Pessoa> lisPessoa = pessoaDao.pesquisaPessoa();
//para evitar erro de lazyException

for(Pessoa p : lisPessoa){
    p.getEnderecos().size();
}

assim eu consigo acessar os enderecos de pessoas sem dar o erro de lazy. mas eu queria ja carregar no select do criteria, sem ter que ficar percorrendo os enderecos e dar um size().

ignacio83
List<Pessoa> lisPessoa = pessoaDao.pesquisaPessoa();  
Hibernate.initialize(lisPessoa);
Criado 24 de abril de 2009
Ultima resposta 24 de abr. de 2009
Respostas 5
Participantes 2