Sou noob mas sou feliz: Oq é uma session do hibernate?

uaheaue, então, quando eu faço

no hiber, eu to fazendo oq? pedindo uma conexão do DataSource? …to fuçando no hibernate só agora haeuhauheua :oops: , ai eu vi na documentação q o bom era ter um singleton q te fornecesse sempre a mesma sessão… ai vi um código de um tutorial lá q o cara chamava openSession() a cada método do DAO q ele utilizava… ai, fiquei curioso, esse openSession() ta relacionado ao q??? :roll:

tipo… eu tenho o seguinte singleton q peguei da própria documentação do hiber…

[code]package br.com.develop.dao;

import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.cfg.Configuration;

public class HibernateUtil {

private static SessionFactory sessionFactory;
public static final ThreadLocal session = new ThreadLocal();

static {

	try {
		
		sessionFactory = new Configuration().configure().buildSessionFactory();	
		
	} catch ( HibernateException e ) {
		
		e.printStackTrace();
	}
}

private HibernateUtil() {
	
	
}

public static Session currentSession() {
	
	Session s = ( Session ) session.get();
	
	try {

		if ( s == null ) {

			s = sessionFactory.openSession();
			session.set( s );
		}
		
	} catch ( HibernateException e ) {
		
		e.printStackTrace();
	}

	return s;
}

public static void closeSession() {
	
	Session s = ( Session ) session.get();
	session.set( null );
	
	try {
		
		if ( s != null )
			s.close();

	} catch ( HibernateException e ) {
		
		e.printStackTrace();
	}
}

}[/code]

ta… a unica coisa q ela faz é te retornar uma session do hiber… ai, nos DAOs eu tenho algo como:

[code]package br.com.develop.dao;

import java.util.List;

import net.sf.hibernate.Hibernate;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.HibernateException;

import br.com.develop.model.User;
import br.com.develop.dao.UserDAO;

public class UserDAO {

public void insertUser( User user ) throws DAOException {

	Session session = HibernateUtil.currentSession();

	try {

		session.save( user );
		session.flush();

	} catch ( HibernateException e ) {

		e.printStackTrace();
		throw new DAOException();

	} finally {

		HibernateUtil.closeSession();
	}
}


public User findUserById( int id ) throws DAOException {

	Session session = HibernateUtil.currentSession();
	User user = null;

	try {

	    user = ( User ) session.load( User.class, new Integer( id ) );
	    session.flush();

	} catch ( HibernateException e ) {
	    
	    e.printStackTrace();
	    throw new DAOException();

	} finally {

	    HibernateUtil.closeSession();
	}
	
	return user;
}


public List findUserByName( String name ) throws DAOException {

	Session session = HibernateUtil.currentSession();
	List users = null;

	try {

	    users = session.find( "from system_user in class User where system_user.name like ? ", 
	            						"%" + name, 
	            						Hibernate.STRING 
	            		);

	} catch ( HibernateException e ) {

		e.printStackTrace();
		throw new DAOException();

	} finally {

		HibernateUtil.closeSession();
	}
	
	return users;
}

// continuação dos métodos do DAO

}[/code]

quero saber se esse é o jeito certo de se trabalhar com o hibernate! … ter um singleton q retorne uma session e todo mundo usa a mesma session… e ter aquele closeSession() lá… sei lá, eu não to ligado no qq o hiber faz por baixo desse código ai, quero desempenho!