LazyInitializationException

3 respostas
vinny767

Olá pessoal,
Estou com um problema na minha aplicação. Quando faço determinadas consultas no banco, ocorre o seguinte erro:

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

Meu DAO está na seguinte forma:

public boolean verificaSeUsuarioEhGemeo(Usuario usuario, Usuario usuarioBase){
		
		if(usuario != null || usuarioBase != null){
		
			QueryParameter prUsuario     = null;
			QueryParameter prUsuarioBase = null;
			
			StringBuilder hql = new StringBuilder();
			hql.append("FROM Gemeo " +
					   "WHERE ");      
					   if(usuario != null)    hql.append("gemeo1.id = :usuario OR ");
					   if(usuarioBase != null)hql.append("gemeo1.id = :usuarioBase OR ");
										
					   if(usuario != null)    hql.append("gemeo2.id = :usuario OR ");
					   if(usuarioBase != null)hql.append("gemeo2.id = :usuarioBase OR ");
					   
					   if(usuario != null)    hql.append("gemeo3.id = :usuario OR ");
					   if(usuarioBase != null)hql.append("gemeo3.id = :usuarioBase OR ");
					   
					   if(usuario != null)    hql.append("gemeo4.id = :usuario OR ");
					   if(usuarioBase != null)hql.append("gemeo4.id = :usuarioBase OR ");
					   
					   if(usuario != null)    hql.append("gemeo5.id = :usuario OR ");
					   if(usuarioBase != null)hql.append("gemeo5.id = :usuarioBase OR ");
					   
					   if(usuario != null)    hql.append("gemeo6.id = :usuario OR ");
					   if(usuarioBase != null)hql.append("gemeo6.id = :usuarioBase OR ");
					   
					   if(usuario != null)    hql.append("gemeo7.id = :usuario OR ");
					   if(usuarioBase != null)hql.append("gemeo7.id = :usuarioBase OR ");
					   
					   if(usuario != null)    hql.append("gemeo8.id = :usuario ");
					   if(usuarioBase != null)hql.append(" OR gemeo8.id = :usuarioBase");
			
			if(usuario != null){
				prUsuario = QueryParameter.create();
				prUsuario.asName("usuario");
				prUsuario.withValue(usuario.getId());
				prUsuario.fromType(new LongType());
			}	
			
			if(usuarioBase != null){
				prUsuarioBase = QueryParameter.create();
				prUsuarioBase.asName("usuarioBase");
				prUsuarioBase.withValue(usuarioBase.getId());
				prUsuarioBase.fromType(new LongType());
			}	
			
			System.out.println("HQL do metodo verificaSeUsuarioEhGemeo: " + hql.toString());
			
			List<Gemeo> listaHql = this.executeHQL(hql.toString(), prUsuario, prUsuarioBase);
			
			if(listaHql.size() == 1) return true;
			else return false;
		}
		return false;
	}

Minha pergunta é: eu devo fazer algum tratamento dentro deste método que eu não estou fazendo? Algo como controlar seção?
Obrigado.

3 Respostas

anderson.bonavides

Veja bem isto:

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

No teu mapeamento tem uma clausula Lazy, da uma olhada lá.

vinny767

Está errado?

Quando na ponta do relacionamento eu tenho uma coleção de objetos, ele tem que ser lazy (onetomany, por exemplo) e quando eu tenho um objeto só tem que ser eager (manytoone, por exemplo). Pelo menos na minha referencia bibliográfica está assim.

Você acha que devo mudar?

Valeu!

anderson.bonavides

Já tive alguns problemas com esta clausula e já vi alguns posts aki no guj sobre ela. Retira ela e faz um teste.

Criado 28 de abril de 2009
Ultima resposta 28 de abr. de 2009
Respostas 3
Participantes 2