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.