LazyInitializationException

Boas,
Tenho os seguinte método de busca no banco de dados:

    @Override
    public List<Reserva> getAll() {
        this.em.getTransaction().begin();
        Query query = em.createQuery("select distinct r from Reserva r left join fetch r.estadia");
        List<Reserva> lista = query.getResultList();
        this.em.getTransaction().commit();
        return lista;
    }

E apartir dele parto para esse metodo:
NOTA: ContaCliente vem do codigo: reserva.getCliente().getConta();

public void debitarReserva(Pagamento pagamento, ContaCliente conta) {
    Divida classeSemNome = new Divida(pagamento);
    conta.getPagamentos().add(classeSemNome);
}

E recebo esse erro na ultima linha:

Exception in thread "AWT-EventQueue-0" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: me.mauro.albamoura.model.ContaCliente.pagamentos, could not initialize proxy - no Session

Para tentar resolver a exception modifiquei o codigo para:

public void debitarReserva(Pagamento pagamento, ContaCliente conta) {
    Divida classeSemNome = new Divida(pagamento);
    
    EntityManager em = new JPAUtil().getEntityManager();
    ContaClienteDao contaDao = new ContaClienteDao(em);
    PagamentoDao pagamentoDao = new PagamentoDao(em);
    pagamentoDao.adicionar(pagamento);
    conta = contaDao.get(conta.getId());
    conta.getPagamentos().add(classeSemNome);
    em.close();
}

Existe uma maneira melhor de fazer isso?

Provavelmente a relação que está definida no mapeamento da sua classe está como LAZY, acredito que bastaria defini-la como EAGER.

1 curtida