JAVA + Hibernate - Problema com sessão (session is closed)

E como você converteu ela?

Segue trecho do meu HibernateUtil

public class HibernateUtil {
    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure().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;
    }
}

Na sua classe HibernateUtil não tem nenhum método getSession() de onde você tira ele?

Fala Fellipe, no exemplo passado não há chamada para o método getSession()

Tem razão robinson, vou testar aqui, do seu jeito.

Tentei do seu jeito, não deu certo Robinson. Você deu uma olhada nas minhas classes p ver como estão?

Minha classe HibernateUtil:

public class HibernateUtil {

private static final SessionFactory sessionFactory = setSession();

private static SessionFactory setSession() {
    try {
        Configuration cfg = new Configuration().configure();
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties());
        
        return cfg.buildSessionFactory(builder.build());
    } catch (Throwable e) {
        System.out.println(e.getMessage());
        return null;
    }
}
public static Session getSession() throws HibernateException {
    Session session = sessionFactory.openSession();
    session.setCacheMode(CacheMode.IGNORE);
    return session;
}

}

Fellipe, o que ocorreu? Seria legal se postasse o log.

O log é esse:

Exception in thread "AWT-EventQueue-0" org.hibernate.SessionException: Session is closed!
	at org.hibernate.internal.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:133)
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1251)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:356)
	at com.sun.proxy.$Proxy8.flush(Unknown Source)
	at produto.ProdutoDAOHibernate.excluirProduto(ProdutoDAOHibernate.java:84)
	at produto.ProdutoRN.excluirProduto(ProdutoRN.java:43)
	at visao.TelaProduto.btnExcluirActionPerformed(TelaProduto.java:358)
	at visao.TelaProduto.access$100(TelaProduto.java:10)
	at visao.TelaProduto$2.actionPerformed(TelaProduto.java:155)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6533)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6298)
	at java.awt.Container.processEvent(Container.java:2236)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
	at java.awt.Container.dispatchEventImpl(Container.java:2280)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Agora começa a clarear, quando der posta o seu método: excluirProduto

ai você indica onde é a linha 84.

produto.ProdutoDAOHibernate.excluirProduto(ProdutoDAOHibernate.java:84)

Vou almoçar, voltando tentamos novamente!!

Esse é o método

@Override
    public void excluirProduto(Integer codigo){
        Transaction t = null;
        Session s = HibernateUtil.getSessionFactory().openSession();
        
        try{
            t = s.beginTransaction();
            s.getTransaction().commit();
        }catch(RuntimeException e){
            if(t != null){
                t.rollback();
            }
            
            e.printStackTrace();
        }finally{
// linha 84 abaixo
            session.flush();
            session.close();
        }
    }

Jovem, muda

de:

session.flush();
session.close();

para:

s.flush(); //nome da nossa variável -> Session s = HibernateUtil.getSessionFactory().openSession();
s.close();

Mudei, agora não aparece mais erro, mas também não faz nada. Verifiquei no banco e não excluiu. O certo seria aparecer no console a query de exclusão, já que ativei o sql_show no hibernate.cfg.xml.

Fellipe, quando puder analisa seu método de exclusão.

*Dica você abre um transação, commita…mas "commita o que?

Fiz uns debugs aqui, a query ta certinha. Só não está executando normal. Então não precisa commitar quando estiver fazendo exclusão? Fiz assim pq meu professor disse que necessitava de commitar.

não é nada disso!!!

no trecho:

try{
   t = s.beginTransaction();
   /*falta a exclusão -> s.delete(seu objeto aqui);*/
  s.getTransaction().commit();
}

*dica: preste atenção nos pequenos detalhes.

Ah sim, foi mal, mas logo depois de mandar pra você eu inseri essa parte:

try{
            t = s.beginTransaction();
            String hql = "DELETE FROM Produto p WHERE p.codigo_produto = :"+codigo;
            Query query;
            query = session.createQuery(hql);
            query.setInteger("codigo_produto", codigo);
            query.executeUpdate();
            s.getTransaction().commit();

OBS: Não estou excluindo por objeto e sim pelo código do objeto.
A sintaxe do hql seria essa mesmo ou estou fazendo errado?

OBS: Desculpa os erros, mas comecei a mexer com Hibernate faz uma semana. Ainda tô engatinhando.

Sem problemas, todos aprendemos todos os dias!!!

Ao invés de misturar com HQL eu faria assim:

t = s.beginTransaction()
Produto produto= (Produto ) s.load(Produto.class, new Integer(codigo));
s.delete(produto);
s.getTransaction().commit();
1 curtida

Consegui aqui cara. Obrigado mesmo, me salvou nessa.

Por nada!! Boa sorte nos estudos!!!