Problemas Hibernate

4 respostas
A

fala galera blz... to precisando de uma ajudinha aqui.. fiz uma aplicação usando hibernate só q estou encontrando um poco de dificuldade. Procurei em alguns topicos mas nenhum me ajudo..

estou encontrando o seguinte erro:

Exception in thread "AWT-EventQueue-0" org.hibernate.HibernateException: org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions

eu sei q esse erro acontece pq um mesmo objeto não pode ser de 2 session diferente, só q meu problema é q não consigo fechar a session quando faço presquisa no banco de dados. se eu fecho ela dentro do metodo de retrono me da um erro q a session foi fechada e não pode retornar.

no metodo de cadastrar funciona corretamente.. o problema é no metodo de alterar. queria saber c esse erro ocorre pq eu não fechei as session?? ou tem alguma outra forma de resolver o erro???

vou posta minha classe DAO e HibernateUtility

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
 *
 * @author Administrador
 */
public class FornecedorDAO extends DAO {

    private SessionFactory factory;

    /** Creates a new instance of FornecedorDAO */
    public FornecedorDAO() {
        factory = new Configuration().configure("/Configuracao/hibernate.cfg.xml").buildSessionFactory();
    }

    @Override
    public void create(Object obj) throws IOException {
        if (obj instanceof negocio.Fornecedor) {
            negocio.Fornecedor fornecedor = (negocio.Fornecedor) obj;

            Session sessao = HibernateUtility.getSession();
            Transaction transaction = null;

            try {
                transaction = sessao.beginTransaction();
                sessao.save(fornecedor);
                transaction.commit();
                sessao.close();

            } catch (HibernateException hx) {
                hx.printStackTrace();
                transaction.rollback();
                throw new HibernateException("" + hx);
            }
        }
    }

    @Override
    public List retrieve(Object key) throws IOException {
        List fornecedores = new ArrayList();
        if (key instanceof negocio.Fornecedor) {
            negocio.Fornecedor fornecedor = (negocio.Fornecedor) key;

            Session sessao = HibernateUtility.getSession();
            try {
                if (fornecedor.getCodigo() != null) {
                    fornecedor = (negocio.Fornecedor) sessao.load(negocio.Fornecedor.class, new Long(fornecedor.getCodigo()));
                    fornecedores.add(fornecedor);
                } else {
                    if (fornecedor.getNome() != null) {
                        Query select = sessao.getNamedQuery("buscarNome");
                        select.setString("nome", fornecedor.getNome());
                        fornecedores = select.list();
                    } else {
                        Query select = sessao.getNamedQuery("buscarTodos");
                        fornecedores = select.list();
                    }
                }
            } catch (HibernateException hx) {
                hx.printStackTrace();
                throw new HibernateException("" + hx);
            } finally {
               // sessao.close();
            }
        }
        return fornecedores;
    }

    @Override
    public void update(Object obj) throws IOException {
        if (obj instanceof negocio.Fornecedor) {
            negocio.Fornecedor fornecedor = (negocio.Fornecedor) obj;

            Session sessao = HibernateUtility.getSession();
            Transaction transaction = null;

            try {
                transaction = sessao.beginTransaction();
                sessao.update(fornecedor);
                transaction.commit();
                sessao.close();

            } catch (HibernateException hx) {
                hx.printStackTrace();
                transaction.rollback();
                throw new HibernateException("" + hx);
            }

        }
    }

    @Override
    public void delete(Object obj) throws IOException {
        if (obj instanceof negocio.Fornecedor) {
            negocio.Fornecedor fornecedor = (negocio.Fornecedor) obj;

            Session sessao = HibernateUtility.getSession();
            Transaction transaction = null;

            try {
                transaction = sessao.beginTransaction();
                sessao.delete(fornecedor);
                transaction.commit();
                sessao.close();

            } catch (HibernateException hx) {
                hx.printStackTrace();
                transaction.rollback();
                throw new HibernateException("" + hx);
            }
        }
    }
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtility {

    private static SessionFactory factory;
    
    static {
        try {
            factory = new Configuration().configure("/Configuracao/hibernate.cfg.xml").buildSessionFactory();
        } catch (Exception e) {
            e.printStackTrace();
            factory = null;
        }
    }

    public static Session getSession() {
        return factory.openSession();
    }
}

4 Respostas

toninhocell

Olha o mais correto seria vc fechar a conexão a cada comunicação com o banco, isso porque manter ela aberta se torna mais oneroso para ele.

A

sim… e qual o modo correto de eu fazer isso… já q c eu fechar a mesma dentro do metodo retrieve por exemplo no finally o sistema me retorna um erro de conexão fechada???

toninhocell

Faz um teste ai, a exemplo deste código logo abaixo pega a sessão como variável de classe e usa ela no seus métodos. E vamos ver no que vai dar.

/*
 * HibernateGenericDAO
 * Data de criação: <9/8/2008>
 * Autor: toninhocell
 */

package br.faculdade.estudos.util;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.classic.Session;

public abstract class HibernateGenericDAO<T, PK extends Serializable>
		implements GenericDAO<T, PK> {

	private Class<T> persistentClass;
	private Session session = HibernateFactory.buildSessionFactory().openSession();

	@SuppressWarnings("unchecked")
	public HibernateGenericDAO() {
		this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}

	public void delete(T obj) {
		try {
			this.getSession().delete(obj);
			this.getSession().flush();
		} catch (Exception e) {
			System.out.println("ERRO : Class -> HibernateGenericDAO -> delete()");
			e.printStackTrace();
		}
	}

	@SuppressWarnings("unchecked")
	public T findById(PK id) {
		return (T) this.getSession().get(persistentClass, id);
	}

	public void saveOrUpdate(T obj) {
		try {
			this.getSession().saveOrUpdate(obj);
			this.getSession().flush();
		} catch (Exception e) {
			System.out.println("ERRO : Class -> HibernateGenericDAO -> saveOrUpdate()");
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<T> findAll() {
		Criteria criteria = this.getSession().createCriteria(persistentClass);
		return criteria.list();
	}

	public Session getSession() {
		return session;
	}

	public void setSession(Session session) {
		this.session = session;
	}
}
A

valeu… vo tenta…

Criado 14 de novembro de 2008
Ultima resposta 14 de nov. de 2008
Respostas 4
Participantes 2