Olá, pessoal, tudo bem?
Tenho no meu projeto 3 entidades, sendo elas - doador, receptor e atendimento.
O Usuário pode se permitir cadastrar doadores e receptores indistintamente, porém, ao cadastrar um atendimento, deverá escolher em uma lista, vários doadores e receptores.
O.k. tudo bem até aí.
Porém ao listar, tenho um problema - esta excessão:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.agets.dominio.Atendimento.doadores, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
AtendimentoDAO
public List<Atendimento> listarTodosOrdenadosPelasMaisAntigos() {
return this.getSession().createCriteria(Atendimento.class).addOrder(Order.desc("dataAtendimento")).list();
}
Tenho esta referência na entidade Receptor:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "receptor_atendimento", joinColumns = { @JoinColumn(name = "ID_RECEPTOR") }, inverseJoinColumns = { @JoinColumn(name = "ID_ATENDIMENTO") })
private List<Atendimento> atendimentos;
e esta na classe Doador também:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "doador_atendimento", joinColumns = { @JoinColumn(name = "ID_DOADOR") }, inverseJoinColumns = { @JoinColumn(name = "ID_ATENDIMENTO") })
private List<Atendimento> atendimentos;
E isto na entidade Atendimento:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "doador_atendimento", joinColumns = { @JoinColumn(name = "ID_ATENDIMENTO") }, inverseJoinColumns = { @JoinColumn(name = "ID_DOADOR") })
private List<Doador> doadores = new ArrayList<Doador>();
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "receptor_atendimento", joinColumns = { @JoinColumn(name = "ID_ATENDIMENTO") }, inverseJoinColumns = { @JoinColumn(name = "ID_RECEPTOR") })
private List<Receptor> receptores = new ArrayList<Receptor>();
O resultado disso é o que eu espero, cria um relacionamento muitos para muitos de Atendimento para Doador e Atendimento para Receptor, e para ambos, uma tabela adicional atendimento_doador e atendimento_receptor.
isto era só para entender a estrutura, mas meu problema está no service:
public List<Atendimento> listarTodos() {
DAOFactory daoFactory = DAOFactory.getDAOFactory();
AtendimentoDAO atendimentoDAO = daoFactory.getAtendimentoDAO();
List<Atendimento> atendimentos = atendimentoDAO.listarTodosOrdenadosPelasMaisAntigos();
///ESTE É O MEU PROBLEMA, SE RETIRAR A CHAMADA Á "ENCERRAR" FUNCIONA.
daoFactory.encerrar();
return atendimentos;
Como comentei o código, se retirar a chamada à ENCERRAR, funciona, mas é a maneira certa de resolver, a minha conexão simplesmente ficará aberta?
Abaixo a minha classe HIBERNATEDAOFactory contendo o método Encerrar e outros para obtenção das sessões.
public class HibernateDAOFactory extends DAOFactory {
private Session session;
private Transaction tx;
public HibernateDAOFactory() {
this.session = HibernateUtil.getSession();
}
@Override
public void cancelarTransacao() {
this.tx.rollback();
this.tx = null;
}
@Override
public void iniciarTransacao() {
this.tx = this.session.beginTransaction();
}
@Override
public void encerrar() {
if (this.tx != null) {
this.tx.commit();
}
this.session.close();
}
@Override
public DoadorDAO getDoadorDAO() {
return new HibernateDoadorDAO(this.session);
}
@Override
public AtendimentoDAO getAtendimentoDAO() {
return new HibernateAtendimentoDAO(this.session);
}
@Override
public ReceptorDAO getReceptorDAO() {
return new HibernateReceptorDAO(this.session);
}
}
Por favor, preciso de ajuda. Como resolver?