Hibernate - Erro na sessao

14 respostas
R

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?

14 Respostas

cv1

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:

Mauricio_Linhares

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

R

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();
}

}

R

Quando chamo List() acontece esse erro…

R

Como funciona esse stack trace ?

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

Porque você está fazendo isso:

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

Deixe assim:

Session session = factory.openSession();

E veja no que é que dá.

R

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

Mauricio_Linhares

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.

R

Mas se a aplicacao cliente for em outra linguagem?

R

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?

Mauricio_Linhares

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.

Mauricio_Linhares

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”.

R

Vou dar uma analisada…
Obrigado novamente

Criado 14 de junho de 2005
Ultima resposta 14 de jun. de 2005
Respostas 14
Participantes 3