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
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.