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
talvez não seja isso não, ele deve ter especificado um autoclose na configuração dele…