Erro no Hibernate ao salvar

Estou com esse problema ao tentar salvar um objeto, como a aplicação está super simples e eu já verifiquei tudo que era possível não sei o que está errado.

A aplicação tem somente um login que mostra a lista de usuários em um combo, em seguida digita a senha e compara com a senha cadastrada e carrega uma página.

Aí tem uma página (que seria o cadastro dos usuários), até esse momento a única operação no banco de dados foi o select da lista de usuários, então quando eu mando atualizar um determinado objeto que é mostrado em uma rich:dataTable dá essa exceção dizendo que a sessão está fechada, mas como pode está fechada se ela não foi fechada em lugar algum?

A listagem é carregada assim (a única operação executada antes do save que está dando o erro):

public List<Usuario> listaUsuariosPorNome() { session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List<Usuario> lista = session.createCriteria(Usuario.class).addOrder(Order.asc("nomeReal")).list(); session.getTransaction().commit(); return lista; }

Tenho um DAO genérico que tem o save:

[code]…
public GenericDAO(Class persistedClass) {
SessionFactory factory = HibernateUtil.getSessionFactory();
this.session = factory.getCurrentSession();
this.persistedClass = persistedClass;
}

public void save(Object object) throws Throwable {
    session.beginTransaction();
    session.save(object); // Linha 31
    session.getTransaction().commit();
}

[/code]

A exceção:

org.hibernate.SessionException: Session is closed! at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49) at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1319) 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:597) at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301) at $Proxy28.beginTransaction(Unknown Source) at org.trans.dao.GenericDAO.save(GenericDAO.java:31) at org.trans.bean.UsuarioDataTableScrollerBean.salvar(UsuarioDataTableScrollerBean.java:134) 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:597) at com.sun.el.parser.AstValue.invoke(AstValue.java:187) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68) at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:88) at javax.faces.event.ActionEvent.processListener(ActionEvent.java:77) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:746) at javax.faces.component.UICommand.broadcast(UICommand.java:368) at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55) at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321) at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296) at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253) at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at org.trans.filtro.FiltroLogado.doFilter(FiltroLogado.java:115) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at org.trans.filtro.SessionTimeoutFilter.doFilter(SessionTimeoutFilter.java:58) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)

O que pode estar causando esse Session closed?

Amigo, primeiramente, apenas para listar os objetos vc não precisar iniciar a transação como vc faz em

session.beginTransaction();

e vc tb não precisa comitar uma listagem, os “comitt’s” são apenas para indicar ao banco q o vc finalizou algo como uma exclusão, inclusão ou alteração então

session.getTransaction().commit(); não é necessário.

outra coisa q percebi é q o seu metodo salvar do seu dao genérico abre a sessão, inicia a transação e comita ela, ate ai td bem mas vc precisa tratar casos como rollback se ocorrer algum erro, talves vc esteja fazendo isso de onde vc chama esse metodo, alem de vc tb precisar fechar a sua sessão com session.close(), apesar de q eu não sei como vc esta implementando as chamadas a estes metodos.

Bom fica ai algumas observações, espero ter ajudado

Obrigado amigo.

Sobre o list, eu havia copiado desse exemplo que vem na documentação do Hibernate.

[code]private List listEvents() {

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

session.beginTransaction();

List result = session.createQuery("from Event").list();

session.getTransaction().commit();

return result;

}[/code]

Vou retirar do meu método que lista, vou deixar ele funcionando e vou focar no save mesmo.

Abusando um pouco, você teria um exemplo simples de um método que salva um objeto?

Outra pergunta, sempre que é feita uma operação CRUD tem que dá session.close() ?

Sou iniciante nessa tecnologia.

Obrigado

Deixei meu método no DAO que lista os usuários assim:

public List<Usuario> listaUsuariosPorNome() { //session = HibernateUtil.getSessionFactory().getCurrentSession(); //session.beginTransaction(); List<Usuario> lista = session.createCriteria(Usuario.class).addOrder(Order.asc("nomeReal")).list(); //session.getTransaction().commit(); return lista; }

No BB para carregar a lista em um combobox:

public List<SelectItem> getUsuarios() { List<SelectItem> lista = new ArrayList<SelectItem>(); Usuario user = new Usuario(); user.setId(0); user.setNomeReal("- Selecione -"); lista.add(new SelectItem(user, user.getNomeReal())); try { List<Usuario> usuarios = new UsuarioDAO().getLista(); for (Usuario item : usuarios) { lista.add(new SelectItem(item, item.getNomeReal())); } } catch (Exception ex) { System.out.println("Erro em getUsuarios(): " + ex.getMessage()); } return lista; }
Agora deu essa mensagem:
Erro em getUsuarios(): createCriteria is not valid without active transaction

Agora não entendo, todos dizem que não é necessário usar o begin e o commit em listas (selects) mas quando eu retiro não funciona.

vc precisa pegar a sessão e ela precisa estar aberta para consultas.

esta linha

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

voce precisa utiizar