Hibernate ThreadLocal

Pessoal qual a melhor maneira de criar uma classe utilitaria para o uso do hibernate. vcs usam ThreadLocal?

uma outra coisa quando se usa ThreadLocal não precisa fechar a session?

valeu

O jeito mais comum é usando ThreadLocal sim … mas serve (i.e: mais bunitinho) via um container IOC qualquer gerenciando isso pra você :wink:

Só não entendi qual a relação do ThreadLocal com o fechar ou não a sessão do Hibernate. Precisa fechar sim :expressionless:

Pois no hibernate in action fala que quando usar a estrategia ThreadLocal não é recomendado fechar a session.

Isso está correto?

Poderia disponibilizar um exemplo de como vcs utilizam ThreadLocal?

SessionFactory != Session

Sessions devem ser fechadas assim que possível.
SessionFactories devem ser fechadas o mais tarde possível. Preferencialmente, nunca :thumbup:

public class HibernateSessionFactory 
 {
   protected class LocalSessionManager extends ThreadLocal {
     protected Object initialValue() {
       Session session;
       try {
           
           session = HibernateSessionFactory.this.sessionFactory.openSession();
           }
   			catch (HibernateException e) {
   				throw new RuntimeException("Problems while opening a new thread local hibernate session", e);
   			}
   			return session;
   		}
   	}
   
   	private static HibernateSessionFactory instance;
   
   	/***
   	 * Acesso ao singleton.
   	 * 
   	 * @return o singleton desta classe
   	 */
   	public static HibernateSessionFactory getFactory() {
   		if (instance == null) {
   			try {
   				instance = new HibernateSessionFactory();
   			}
   			catch (Exception e) {
   				
   				throw new RuntimeException("problems while instantiating the singleton", e);
   			}
   		}
   		return instance;
   	}
   
   	private SessionFactory sessionFactory;
   
   	private LocalSessionManager sessionManager = new LocalSessionManager();
   
   	/***
   	 * Construtor privado para o singleton
   	 * 
   	 * @throws IOException
   	 * @throws HibernateException
   	 */
   	private HibernateSessionFactory() throws HibernateException {
   		Configuration cfg = new Configuration();
   		cfg.addClass(Cliente.class);
   		cfg.addClass(Pedido.class);
   		
   		this.sessionFactory = cfg.buildSessionFactory();
   	}
  
   	/***
   	 * Pega uma sessão do Hibernate.
   	 * Talvez essa sessão seja aberta agora, caso a Thread.currentThread() nunca tenha
   	 * pedido uma sessão ainda.
   	 * 
   	 * @return uma sessão do hibernate.
  	 */
  	public Session getSession() {
  		Session session = (Session) this.sessionManager.get();
  		return session;
  	}
  	
  	public Session getNewSession() {
  		Session session;
  		try {
  			session = this.sessionFactory.openSession();
  		}
  		catch (HibernateException e) {
  			throw new RuntimeException("Problems while opening a new hibernate session", e);
  		}
  		return session;		
  	}
   

Esse codigo está certo? e como utilizaria na pratica?

valeu pessoal pelas respostas