Erro usando o hibernate "Session is closed!"

Olá, amigos!

Acabei de me deparar com um problema enquanto testava meu código. O hibernate emite um erro dizendo que minha ‘sessão’ esta fechada quando eu tento atualizar um objeto da classe ParcelaRequisicao.java. Entretanto, eu faço atualizações de muitos objtos e nunca tive esse problema (usando o mesmo DAO e DAOFactory). O problema é somente nesse caso.

Vou postar o erro que da e se alguem entender o que acontece, por favor me explique.

OBS: Estou online no forum entao se precisar de alguma classe posso postar na hora.

Exception in thread "AWT-EventQueue-0" org.hibernate.SessionException: Session is closed! at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72) at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1346) at br.com.guaicurus.dao.DAOFactory.beginTransaction(DAOFactory.java:26) at br.com.guaicurus.dao.DAO.atualiza(DAO.java:44) at br.com.guaicurus.visao.Pagamentos.jButtonConfirmarActionPerformed(Pagamentos.java:427) at br.com.guaicurus.visao.Pagamentos.access$200(Pagamentos.java:29) at br.com.guaicurus.visao.Pagamentos$3.actionPerformed(Pagamentos.java:142) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) at java.awt.Component.processMouseEvent(Component.java:6263) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6028) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Desde ja agradeço a todos.

Coloca seu código

Este é o metodo que esta me dando problemas. É a implementação da ação do botão ‘confirmar’.

[code]private void jButtonConfirmarActionPerformed(java.awt.event.ActionEvent evt) {

    if(jdcDataPag.getDate() != null) {
        if(buscaRequisicao != null) {

            ContasPagar contasPagar = new ContasPagar();
            contasPagar.setVencimento(jdcDataPag.getDate());
            contasPagar.setValor(Double.parseDouble(jlVlrPag.getText()));
            //Data d = new Data();
            /**
             * Procura pelas parcelas da requisicão que foi 'buscada' em um outra JFrame
             * caso as encontre verifica quais estão selecionadas para serem pagas
             * e coloca "pago = true" e a data do pagamento.
             * Logo depois atualiza as parcelas e a requisição.
             * Por fim, adiciona a requisição a contas pagas.
             */
            for(ParcelaRequisicao pr : listaParcelaRequisicao) {
                if(pr.getRequisicao().getId().equals(buscaRequisicao.getId())) {
                    for(int i=0; i<jtParcelas.getRowCount();i++) {
                        if(jtParcelas.getValueAt(i, 2).toString().equals("true") &
                                jtParcelas.getValueAt(i, 0).toString().equals(pr.getDataParcela().toString())) {
                            pr.setPago(true);
                            pr.setDataPag(jdcDataPag.getDate());
                            buscaRequisicao.setNumeroParcelasFim(buscaRequisicao.getNumeroParcelasFim() - 1);

                            DAO<ParcelaRequisicao> daoPR = new DAOFactory().getParcelaRequisicaoDAO();
                            daoPR.atualiza(pr);
                            
                        }
                    }
                }
            }
            if(buscaRequisicao.getNumeroParcelasFim() == 0)
                buscaRequisicao.setPago(true);

            DAO<Requisicao> daoR = new DAOFactory().getRequisicaoDAO();
            daoR.atualiza(buscaRequisicao);
            
            contasPagar.setRequisicao(buscaRequisicao);

            DAO<ContasPagar> daoContasPagar = new DAOFactory().getContasPagarDAO();
            daoContasPagar.adiciona(contasPagar);
            JOptionPane.showMessageDialog(this, "Pagamento salvo com sucesso.");
        }
    }else {
        JOptionPane.showMessageDialog(this, "Por favor, coloque a data do pagamento.");
    }
}[/code]

Aqui esta o DAO e o DAOFactory

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package br.com.guaicurus.dao;

import java.util.List;
import org.hibernate.Session;

/**
*

  • @author higornucci
    */
    public class DAO {

    private Session session;
    private Class classe;
    private DAOFactory factory = new DAOFactory();

    public DAO(Session session, Class classe) {
    this.session = session;
    this.classe = classe;
    }

    public void adiciona(T p) {
    factory.beginTransaction();
    session.save§;
    factory.commit();
    factory.close();
    session.close();
    }

    public void remove(T p) {
    factory.beginTransaction();
    this.session.delete§;
    this.session.flush();
    factory.commit();
    factory.close();
    session.close();
    }

    public void atualiza(T p) {
    factory.beginTransaction();
    this.session.merge§;
    this.session.flush();
    factory.close();
    session.close();
    }

    public List listaTudo() {
    List lista = this.session.createCriteria(this.classe).list();
    session.close();
    return lista;
    }

    public T procura(Long id) {
    return (T) session.load(this.classe, id);
    }
    }
    [/code]

[code]package br.com.guaicurus.dao;

import br.com.guaicurus.modelo.ContasPagar;
import br.com.guaicurus.modelo.Empresa;
import br.com.guaicurus.modelo.ParcelaRequisicao;
import br.com.guaicurus.modelo.Requisicao;
import br.com.guaicurus.modelo.Servico;
import br.com.guaicurus.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
*

  • @author higornucci
    */
    public class DAOFactory {

    private final Session session;
    private Transaction transaction;

    public DAOFactory(){
    session = HibernateUtil.getSession();
    }

    public void beginTransaction() {
    this.transaction = this.session.beginTransaction();
    }

    public void commit() {
    this.transaction.commit();
    this.transaction = null;
    }

    public boolean hasTransaction() {
    return this.transaction != null;
    }

    public void rollback() {
    this.transaction.rollback();
    this.transaction = null;
    }

    public void close() {
    this.session.close();
    }

    public DAO getEmpresaDAO() {
    return new DAO(this.session, Empresa.class);
    }

    public DAO getServicoDAO() {
    return new DAO(this.session, Servico.class);
    }

    public DAO getContasPagarDAO() {
    return new DAO(this.session, ContasPagar.class);
    }

    public DAO getRequisicaoDAO() {
    return new DAO(this.session, Requisicao.class);
    }

    public DAO getParcelaRequisicaoDAO() {
    return new DAO(this.session, ParcelaRequisicao.class);
    }
    }
    [/code]

Agora eu ri :smiley: de verdade

Primeiro falava que a sessão estava fechada. Então estava ‘fuçando’ e mudando dai apareceu.

um erro dizendo que tinha duas sessões abertas. Queimei o fuzivel do riso o_O

Será que não vou acertar nunca #desabafo

Então

quando vc executa algo vc fecha a sessão

assim qdo vc vai usar de novo, ela já está fechada, vc teria que deixa-la aberta até vc terminar de usar

e quanto ao segundo erro, é pq vc usou mais de uma sessão para seus objetos.

Enquanto vc faz as coisas no banco, vc deve ter apenas uma sessão. qdo for pra outra coisa, ai vc fecha essa e abre uma nova na outra coisa.

Então XD

Eu tentei fechar de várias maneiras, mas não estou conseguindo.

Alguem pode me dar uma dica de como eu devo fazer isso?

Então, vc n deve fechar, só quando realmente aquela parte n for mais fazer nada

tipo

a pagina manda os dados pra minha servlet

na servlet eu uso a mesma sessão para fazer inserts, updates e deletes, quando o processamento dessa servlet acabar (assim q ela tiver feito tudo q tiver q fazer) eu fecho a sessão do hibernate

do jeito q vc mostrou no código

a classe repositorio pega uma e passa a um método

esse método usa ela e fecha

na segunda vez o seu repositorio vai passar a session fechada para o seu método e vai dar erro

vc tem q garantir que durante determinado processo a sessão seja a mesma.

Eu prefiro usar DAO, assim eu sempre passo a mesma sessão para o DAO e o mesmo nunca fecha ela, eu fecho qdo acabo de usar a sessão

Cara valeu pela sua ajuda xD

Fico até com vergonha de falar mas o problema acabou nem sendo este ^^

Minhas classes persistentes que estavam erradas… eu fiz (por engano ^^’) ManyToOne na classe requisicao e ManyToOne na classe pagamento hehehehe #tenso

Mas valeu pelo apoio

Bom, agora surgiu outro problema usando as mesmas classes.

Qdo eu vou atualizar um objeto da classe ParcelaRequisicao (linhas 26 e 27 do primeiro post). O compilador diz que deu certo, mas qdo eu olho no banco de dados ainda não esta atualizado. O DAO funciona na outras intruçções de atualização, menos nessa.

Alguem tem alguma idea? (me disseram pra usar session.flush(); mas ja uso e nao esta dando certo)