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

Pessoa, estou com um problema que não consigo resolver de forma alguma. É o seguinte: estou criando uma aplicação desktop, usando JAVA + Hibernate + PostgreSQL em que somente a operação de exclusão não está funcionando. Já tentei usar vários tipos de soluções, só que nenhuma resolveu.
HibernateUtil.java

package util;

import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.SessionFactory;

public class HibernateUtil{
    private static final SessionFactory sessionFactory = buildSessionFactory();
    
    private static SessionFactory buildSessionFactory(){
        try{
            Configuration cfg = new Configuration();
            cfg.configure("hibernate.cfg.xml");
            
            StandardServiceRegistryBuilder registradorServico = new StandardServiceRegistryBuilder();
            registradorServico.applySettings(cfg.getProperties());
            StandardServiceRegistry servico = registradorServico.build();
            return cfg.buildSessionFactory(servico);
            
        }catch(Throwable e){
            System.out.println("Criacao inicial do objeto SessionFactory falhou. Erro: " + e);
            throw new ExceptionInInitializerError(e);
        }
    }
    
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
}

DAOFactory.java

package util;

// Importação da classe ProdutoDAOHibernate
import produto.ProdutoDAOHibernate;
// Importação da classe ProdutoDAO
import produto.ProdutoDAO;

public class DAOFactory{
    
    /*
     * Método que cria uma sessão para trabalhar com os produtos
     * É do tipo ProdutoDAO
     * Retorna um objeto do tipo ProdutoDAO
     */
    public static ProdutoDAO criarProdutoDAO(){
        // Instancia um objeto do tipo ProdutoDAOHibernate
        ProdutoDAOHibernate produtoDAO = new ProdutoDAOHibernate();
        // Seta a sessão
        produtoDAO.setSession(HibernateUtil.getSessionFactory().getCurrentSession());
        // retorna o objeto
        return produtoDAO;
    }
}

ProdutoDAOHibernate.java

package produto;

import java.util.ArrayList;
import util.HibernateUtil;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;

public class ProdutoDAOHibernate implements ProdutoDAO{
    private SessionFactory sf;
    Transaction transaction;
    Session currentSession;

    private Session session;
    
    /*
     *
     */
    public ProdutoDAOHibernate(){
        this.sf = HibernateUtil.getSessionFactory();
        this.currentSession = this.sf.getCurrentSession();
        this.transaction = null;
    }
    
    /*
     *
     */
    public void setSession(Session session){
        this.session = session;
    }
    
    /*
     *
     */
    public void salvarProduto(Produto produto){
        try{
            transaction = currentSession.beginTransaction();
            this.session.save(produto);	
            transaction.commit();
            
            if(currentSession.isOpen()){
                currentSession.close();
            }
        }catch(Throwable ex){
            try{
                if(transaction.isActive()){
                    transaction.rollback();
                }
            }catch(Throwable t){
                t.printStackTrace();
            }			
        }
    }
    
    /*
     *
     */
    @Override
    public void atualizarProduto(Produto produto){
        this.transaction = currentSession.beginTransaction();
        this.session.update(produto);
        this.transaction.commit();
    }
    
    @Override
    public void excluirProduto(Integer codigo){
        this.transaction = currentSession.beginTransaction();
        String hql = "DELETE FROM Produto p WHERE p.codigo_produto = :"+codigo;
        Query query = this.session.createQuery(hql);
        query.setInteger("codigo_produto", codigo);
        query.executeUpdate();
        this.transaction.commit();
    }
    
    /*
     *
     */
    @Override
    public Produto carregarProduto(Integer codigo){
        
        return (Produto) this.session.get(Produto.class, codigo);
    }
    
    /*
     *
     */  
    @Override
    public List<Produto> listarProdutos(){
        currentSession.beginTransaction();
        
        List produto = new ArrayList();
        produto = this.session.createCriteria(Produto.class).addOrder(Order.asc("codigo_produto")).list();
        currentSession.close();
        return produto;
    }
}

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 
<hibernate-configuration>
    <session-factory>
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="connection.url">jdbc:postgresql://localhost:5432/acougue</property>
        <property name="connection.username">postgres</property>
        <property name="connection.password">5557975</property>
        <property name="current_session_context_class">thread</property>
        <property name="hibernate.hbm2ddl.auto">none</property>
        <property name="show_sql">true</property>
        
        <mapping class="produto.Produto"/>
    </session-factory>
</hibernate-configuration>

Tem um botão na tela que pega o código e leva para ProdutoRN, de lá é chamada o método excluirProduto de ProdutoDAOHibernate passando como argumento o código.

Quando tento excluir o produto, dá esse erro no console:

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.beginTransaction(SessionImpl.java:1469)
	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.beginTransaction(Unknown Source)
	at produto.ProdutoDAOHibernate.excluirProduto(ProdutoDAOHibernate.java:70)
	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)

Alguém sabe como resolver? Att.

Sempre q vc se conecta com o banco, deve-se fecha-lo, vou mostra a vc como estão meus métodos, para vc ver como exemplo:

private final Session session = HibernateUtil.getSession();

public void createAlter(Setor Setor) {
    try {
        session.getTransaction().begin();
        session.saveOrUpdate(Setor);
        session.getTransaction().commit();

    } finally {
        if (session != null) {
            session.close();
        }
    }
}

public List<Setor> findSetorEntities() {
    try {
        return session.createCriteria(Setor.class).addOrder(Order.asc("nomeSetor")).list();
    } finally {
        session.close();
    }
}

Perceba que eu ja pego a variável do HibernateUtil como Session, isso pq converto ele la na classe, ja q vou utiliza-la apenas desta forma.

Bom dia Fellipe,

Eu opto por recuperar a session em cada método, veja:

public class UserDao {

    public void addUser(User user) {
        Transaction trns = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            session.save(user);
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }

    public void deleteUser(int userid) {
        Transaction trns = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            User user = (User) session.load(User.class, new Integer(userid));
            session.delete(user);
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }

    public void updateUser(User user) {
        Transaction trns = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            session.update(user);
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }

    public List<User> getAllUsers() {
        List<User> users = new ArrayList<User>();
        Transaction trns = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            users = session.createQuery("from User").list();
        } catch (RuntimeException e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return users;
    }

    public User getUserById(int userid) {
        User user = null;
        Transaction trns = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            String queryString = "from User where id = :id";
            Query query = session.createQuery(queryString);
            query.setInteger("id", userid);
            user = (User) query.uniqueResult();
        } catch (RuntimeException e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return user;
    }
}

Espero que seja útil.

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.