Erro ao trazer dados de um consulta de n para n

2 respostas
J

Pessoal, bom dia!
Tenho um relacionamento N para N da seguinte forma:
No banco são tres tabelas: pessoa, grupo e pessoa_grupo
No Sistema tenho apenas duas classes com o seguinte código:

Classe Grupo:

@ManyToMany(fetch=FetchType.LAZY)

@JoinTable(name=pessoa_has_grupo, schema=cerimonial, joinColumns={@JoinColumn(name=grupo_id)},

inverseJoinColumns={@JoinColumn(name=pessoa_id)})	

public Collection getPessoa() {

return pessoa;

}
Classe Pessoa:

@ManyToMany(fetch = FetchType.LAZY)

@JoinTable(name = pessoa_has_grupo, schema=cerimonial, joinColumns = {@JoinColumn(name = pessoa_id)},

inverseJoinColumns = {@JoinColumn(name = grupo_id)})

public Collection getGrupo() {

if (grupo == null)

grupo = new ArrayList();

return grupo;

}

Na tela do sofware, quando mando ele buscar todas as pessoas cadastradas em um determinado grupo acontece o seguinte erro:

HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: org.apache.jasper.JasperException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.cerimonial.dominio.Grupo.pessoa, no session or session was closed

org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)

org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)

com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)

com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)

org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)

root cause

org.apache.jasper.JasperException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.cerimonial.dominio.Grupo.pessoa, no session or session was closed

org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
...

root cause

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.cerimonial.dominio.Grupo.pessoa, no session or session was closed
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected

A consulta que estou executando é a seguinte:
public String listarPessoas() throws Exception {

if (getGrupo() != null && getGrupo().getId() != null) {

try {

	Session sessao = HibernateUtil.getSessao();
	Integer idGrupo = getGrupo().getId();
	List<Grupo> consulta;

	consulta = sessao.createCriteria(Grupo.class).
	add(Expression.eq("id", idGrupo)).
	list();
			
	setListaGrupo(consulta);
			

} finally {
HibernateUtil.fechar();

}

}

return SUCCESS;

}

A questão é seguinte: Porque está acontecendo este erro?

2 Respostas

Mero_Aprendiz

Olá…
Acredito que seja simples…

Uma atenção especial no no session or session was closed, porque você faz isso aqui.

Esse HibernateUtil.fechar(); deve estar fechando a sessão, e quando vai trazer por Lazy, não existe mais a sessão…
Dá uma olhadinha em HQL e como trazer os dados por Fecht.

[]'s

JL

Dica: usa as tags de código daqui do GUJ. O código fica bem mais legivel.

J

Eu dei uma olhada na internet e na documentação do Hibernate, mas não encontrei nada parecido com o meu problema.
Eu tenho que montar uma consulta hql com junções do tipo left join fetch?

Criado 2 de março de 2009
Ultima resposta 5 de mar. de 2009
Respostas 2
Participantes 2