LazyInitializationException

6 respostas
A

Olá galera,
primeiramente peço desculpas caso já exista algum tópico parecido, porém não encontrei ninguem me explicasse com clareza a minha dúvida.

Minha dúvida é a seguinte.

Na minha aplicação tenho um banco com uma tabela de usuario e uma de veiculo com a chave do usuario. Ou seja uma many-to-one.
Eu não estava fechando as sessoes do hibernate e estava tudo certo.
Agora estou passando a fechar a sessao em cada metodo que acesso o banco. Porém está ocorrendo o LazyInitializationException.

Qual seria a melhor forma de trabalhar com esse relacionamento?
Utilizando lazy=false? Utilizando join?
Se for com join, como faço para popular o objeto com as colunas do resultado?

6 Respostas

A

Ps.: é correto usar um findAll para usuario e depois um findByUsuario para achar os veiculo?

Lavieri

se vc for fechar a sessão teu fetch tem q ser EAGER e não LAZY…

A

Cara desculpe a ignorancia, mas como configuro isso sem usar annotations.

Guilherme_Gomes

No arquivo de configuração da classe no Hibernate, no mapeamento many-to-one você coloca lazy=“false”

Existe uma outra opção, você pode usar o session.merge() para reaver a sua entidade do banco, ou seja, o merge() vai retornar a entidade que você quer, com estado que ela está no banco e você pode utiliza-la novamente até o a session atual fechar.

Se ficou muito confuso:

Entidade e = pegaEntidadeDeAlgumLugar(); // A entidade estava armazenada em algum lugar e a sessão que carregou ja foi fechada
e = session.merge(e); // Carrega de novo a entidade do banco e coloca ela dentro da nova session
// Aqui você já pode trabalhar com a entidade sem o problema do lazy init
A

Cara, deculpe
acho q não entendi, ou não implementei corretamente.

public List<Usuario> findAll(){
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		List<Usuario> list = new ArrayList<Usuario>();
		try{
			Query query = session.createQuery("from Usuario u");
			list = query.list();
			session.merge(new VeiculoDAO().findAll());
			return list;
		}catch(RuntimeException re){
			return list;
		}finally{
			session.flush();
			session.close();
		}
	}
A

Ainda persiste o erro.

Tenho certeza de que não implementei corretamente.

Só pra lembrar não estou usando nenhum framework de apresentação.

Criado 6 de abril de 2009
Ultima resposta 7 de abr. de 2009
Respostas 6
Participantes 3