Hibernate - Erro na sessao

Amigos estou com um problema aparentemente na session.

Acontece o seguinte erro… a primeira vez que utilizo a sessao ela funciona… o problema ocorre quando eu uso na segunda vez… ela diz que esta closed…

Sera pq?

A bola de cristal ta meio embacada hoje (sabe como eh, terca-feira eh pior que segunda). Nao da pra saber com so isso de informacao.

Mas eu confio na Session - se ela disse que esta fechada, eh pq alguem fechou a dita. :wink:

Coloca o stack trace da exceção aí.

Tambem acho que algo de estranho esta contecendo … vou postar o fonte aqui…

package meuservico;

import java.util.Iterator;
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class AmigoDAO {

private SessionFactory factory;
protected Session session;
private int size = 0;
private Amigo[] arrayAmigo = null;

public AmigoDAO() throws Exception {
	HibernateUtil.beginTransaction();
	factory = new Configuration().addClass(Amigo.class)
			.buildSessionFactory();
}

public void insert(Amigo amigo) throws Exception {
	session = HibernateUtil.getSession();
	Session session = factory.openSession();
	session.save(amigo);
	session.flush();
	HibernateUtil.commitTransaction();
	session.close();

}

public Amigo[] List() throws Exception {

	Amigo amigoDTO = null;
	//Amigo[] arrayAmigo = null;
	Session session = factory.openSession();
	session = HibernateUtil.getSession();
	//List amigos = session.createSQLQuery("select {u.*} from amigos
	// {u}","u",Amigo.class).list();
	//Criteria select = session.createCriteria(Amigo.class);
	Query q = session.createQuery("from Amigo a");
	List amigos = q.list();
	//List amigos = select.list();

	int i = 0;
	if (amigos.size() > 0) {
		arrayAmigo = new Amigo[amigos.size()];
		size = amigos.size();
		for (Iterator inter = amigos.iterator(); inter.hasNext();) {
			Amigo am = (Amigo) inter.next();
			amigoDTO = new Amigo();
			amigoDTO.setNome(am.getNome());
			amigoDTO.setCelular(am.getCelular());
			amigoDTO.setEmail(am.getEmail());
			amigoDTO.setEndereco(am.getEndereco());
			amigoDTO.setTelefone(am.getTelefone());
			amigoDTO.setNascimento(am.getNascimento());
			//System.out.println(am.getNome());
			arrayAmigo[i] = amigoDTO;
			i++;
		}
	}

	session.flush();
	HibernateUtil.commitTransaction();
	session.close();
	return arrayAmigo;
}

public Amigo retrieve(String pk) throws Exception {
	Session session = factory.openSession();
	session = HibernateUtil.getSession();
	//Session session = factory.openSession();
	Amigo amigo = (Amigo) session.load(Amigo.class, pk);
	session.flush();
	HibernateUtil.commitTransaction();
	session.close();
	return amigo;
}

public void delete(Amigo amigo) throws Exception {
	Session session = factory.openSession();
	session = HibernateUtil.getSession();
	//Session session = factory.openSession();
	session.delete(amigo);
	session.flush();
	HibernateUtil.commitTransaction();
	session.close();
}

}

Quando chamo List() acontece esse erro…

Como funciona esse stack trace ?


try {
      ....
} catch (Exception e) {
      e.printStackTrace();
}

Porque você está fazendo isso:

Session session = factory.openSession();
session = HibernateUtil.getSession(); 

Deixe assim:

Session session = factory.openSession();

E veja no que é que dá.

Amigo obrigado… vc deve ter notado que sou novato em java… mas essas ajudas que são fundamentais para o crescimento da comunidade…
Obrigado…

Ah… ja aproveitando para pedir a opiniao de vcs…
Esse metodo de usar vetor de objetos eh a melhor solução pra passar registros para minha aplicacao cliente em web service?

Valeus

Você deveria continuar usando a List que o Hibernate retorna, é muito melhor do que simplesmente transformar ela em um array, que só vai tomar tempo de processamento da aplicação.

Mas se a aplicacao cliente for em outra linguagem?

Amigo essa minha duvida ainda nao consegui tirar…
Olha soh… quando tenho o retorno de apenas uma classe tipo a do meu exemplo anterior… tudo bem… eu retorno a classe toda… mas quando eu tiver mais classes envolvidas no meu select e retornar campos diversos… como farei o retorno dos dados? Terei que retornar um array de cada classe? Como poderia fazer isto?

Aí você não pode mandar nem um vetor de objetos, vai ter que transformar isso em alguma coisa que a outra linguagem possa entender, provavelmente XML.

Olhe o tutorial do Hibernate 3 aqui do GUJ:

http://www.guj.com.br/java.tutorial.artigo.174.1.guj

Pra carregar coleções de objetos relacionados, você vai ter que usar “left join fetch”.

Vou dar uma analisada…
Obrigado novamente