Erro Hibernate - commitTransaction - Urgente!

Bom dia pessoal,

estou utilizando o Hibernate na minha aplicação, e sempre que eu tento dar um commitTransaction ele lança a exceção abaixo:

org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:993)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy14.flush(Unknown Source)
at br.com.maringa.requisicao.dao.Dao.commitTransaction(Dao.java:77)
at br.com.maringa.requisicao.dao.gerenciadores.CentroCustoGerenciador.commitTransaction(CentroCustoGerenciador.java:63)
at robo.action.AtualizaDadosAction.cadastraNovoCC(AtualizaDadosAction.java:237)
at robo.action.AtualizaDadosAction.processarCC(AtualizaDadosAction.java:158)
at robo.Job.run(Job.java:58)

este erro também ocorre no rollbackTransaction…

o beginTransaction funciona normalmente…

alguém pode me ajudar nisso?

Valew

HUmmm… . vc tah fazendo alguma operação q faz com q o hibernate feche a conexão, posta o seu código pra eu dar uma olhada…

este é o meu método que está dando erro…

		private void cadastraNovoCC (Clienteportal cli, String ccNome, String ccDesc, String ccRegi) throws RegionalInexistenteException, Exception {
		Centrocusto cc = new Centrocusto();
		// preenche dados do centro de custo
		cc.setNome(ccNome.trim().toUpperCase());
		cc.setDescricao(ccDesc.trim().toUpperCase());

		List<Regional> listregional = regionalGerenciador.getRegionalCadCC(cli.getId(),ccRegi);

		Regional regional = new Regional();
		if (listregional == null || listregional.size() == 0){
			logger.error("Razao: Regional não existe: " + ccRegi);
			throw new RegionalInexistenteException("Regional não existe.");
		} else {
			regional = listregional.get(0);
		}

		cc.setRegional(regional);


		cc.setClienteportal(cli);
		cc.setAtivo(true);
		cc.setDatacad(new Date());

		// verifica se já existe este cc
		if (centroCustoGerenciador.getCentrocusto  (cli.getId(),cc.getNome()) != null) {
			System.out.println("Centro de custo já cadastrado.");
			throw new Exception("Centro de custo já cadastrado");			
		}

		try {
			centroCustoGerenciador.beginTransaction();  // abre transacao
			centroCustoGerenciador.salvar(cc);  // salva centro de custo
			//centroCustoGerenciador.commitTransaction();  // efetua commit da transacao         ***********Erro aqui
		} catch (org.hibernate.exception.ConstraintViolationException e) {
			logger.error("Erro: " + e.getMessage() + "\nRazao: Centro de custo já cadastrado: " + cc.getNome());			
			//centroCustoGerenciador.rollbackTransaction();         ***********Erro aqui         
		} catch (Exception e) {
			logger.fatal("Erro: " + e.getMessage());			
			//centroCustoGerenciador.rollbackTransaction();         ***********Erro aqui
		}
	}

precisa do código em que eu crio a session?

Se por acaso seu problema ainda não foi resolvido, coloca o código da session aqui também, pois o que está acontecendo é que a session está sendo fechada antes do commit.

Eu estou utilizando o mentawai portando nesse método eu estou buscando uma instancia dos objetos no ApplicationManager.

		public boolean injectDependency () {
		try {
			// capturando instancias dos DAOs
			clienteGerenciador = (ClienteGerenciador )ApplicationManager.getInstance().getComponent("clienteGerenciador").getInstance();
			centroCustoGerenciador = (CentroCustoGerenciador )ApplicationManager.getInstance().getComponent("centroCustoGerenciador").getInstance();
			regionalGerenciador = (RegionalGerenciador )ApplicationManager.getInstance().getComponent("regionalGerenciador").getInstance();
			usuariorequisicaoGerenciador = (UsuariorequisicaoGerenciador )ApplicationManager.getInstance().getComponent("usuariorequisicaoGerenciador").getInstance();
			perfilGerenciador = (PerfilGerenciador )ApplicationManager.getInstance().getComponent("perfilGerenciador").getInstance();
			usuarioGerenciador = (UsuarioGerenciador )ApplicationManager.getInstance().getComponent("usuarioGerenciador").getInstance();
			solicitantesccGerenciador = (SolicitantesccGerenciador )ApplicationManager.getInstance().getComponent("solicitantesccGerenciador").getInstance();
			aprovadoresccGerenciador = (AprovadoresccGerenciador )ApplicationManager.getInstance().getComponent("aprovadoresccGerenciador").getInstance();

			// capturando instancia do DAO geral
			dao = (DaoGenericoInterface )ApplicationManager.getInstance().getComponent("dao").getInstance();
			// criando session do hibernate
			session = HibernateUtil.getSessionFactory().getCurrentSession();

			// injetando a session no dao geral
			dao.setSession(session);

			// injetando o dao geral nos daos especificos
			clienteGerenciador.setDao(dao);
			centroCustoGerenciador.setDao(dao);
			regionalGerenciador.setDao(dao);
			usuariorequisicaoGerenciador.setDao(dao);
			perfilGerenciador.setDao(dao);
			usuarioGerenciador.setDao(dao);
			solicitantesccGerenciador.setDao(dao);
			aprovadoresccGerenciador.setDao(dao);

			// injetado com sucesso
			isInjected = true;
			logger.info("Dependencias injetadas");
		} catch (HibernateException e) {
			e.printStackTrace();
			isInjected = false;
			return false;
		} catch (InstantiationException e) {
			e.printStackTrace();
			isInjected = false;
			return false;
		}
		return true;
	}

e a classe HibernateUtil abaixo :

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            //sessionFactory = new Configuration().configure().buildSessionFactory();
        	sessionFactory = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

provavelmente deve ser alguma coisa boba…
mas não estou conseguindo ver… rs

No lugar de:

session = HibernateUtil.getSessionFactory().getCurrentSession();

coloca,

session = HibernateUtil.getSessionFactory().openSession();

vê se isso resolve :smiley:

talvez não seja isso não, ele deve ter especificado um autoclose na configuração dele…