Hibernate - Erro ao Fechar Session!

Estou com um problema em um relacionamento Many-To-Many, quando dou um session.close() me resulta o seguinte erro:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.accion.modelo.Usuario.filial, no session or session was closed

Classe Retorna Usuario

public class RetornaUsuario {
	
	@SuppressWarnings("unchecked")
	public Usuario retornaUsuario(String nomeUsuario){

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		Query q = session.createQuery("from Usuario u where u.nome_usuario = :nome");
		q.setParameter("nome", nomeUsuario); 
		
		Usuario usuario = (Usuario) q.uniqueResult();

                session.close();
		return usuario;	
		
	}
}

Tenho vários relacionamentos nessa classe 2 One-to-Many e 2 Many-to-Many

O erro está dando quando tento acessar os dados do 2º relacionamento Many-To-Many

@ManyToMany(targetEntity = Filial.class)
	@JoinTable(name = "web_usuario_filial_emp", joinColumns = { @JoinColumn(name = "webusuarioid") }, inverseJoinColumns = { @JoinColumn(name = "filialid") })
	private List<Filial> filial;

O que fazer? :frowning:

O problema é como vc está carregando (ou não está carregando) as coleções nos relacionamentos.

Para corrigir esse problema, vc pode alterar a query para trazer os dados das coleções, ou alterar o FetchMode para EAGER nesses relacionamentos.

De uma olhada em Open Session in View

Perfeito… Muito obrigado.

Alterei o Fetch para Eager e resolveu! :lol:

Na prática qual seria a diferença entre Eager e Lazy?

sei que eager são síncronos e lazy assíncronos

O modo EAGER do Fetch carrega o relacionamento no momento da carga da entidade principal. E o modo LAZY, que é o default, carrega o realacionamento no momento que vc acessa pelo método getFilial, no seu caso.
O modo LAZY só funciona dentro de uma sessão, ou seja, quando vc acessa um relacionamento dentro da sessão aberta é realizada uma query que busca os dados para o relaciomento.

No seu caso vc tentou acessar um relaciomanento, com a sessão fechada, e o objeto se encontrava “destacado”, por isso foi lançada uma Exceção do tipo LazyInitializationException.

Se vc estiver usando hibernate num applicação web, vale a pena a dica do peczenyj, que é o Padrão de Projeto Open Session in View.

Tranquilo!

Estou utilizando em uma aplicação Web sim, vou pesquisar mais sobre o padrão Open Session in View.

Muito obrigado pela ajuda Marcusmage! e mais uma vez obrigado pela dica peczenyj!

Ajudaram pakas :lol: