Hibernate - ThreadLocal

Estou estudando o Framework Hibernate em aplicação Web. Eu estava com problema de LazyException quando precisava usar um objeto(Lazy) na jsp que era fornecido por um Servlet... Ai vocês me indicaram o [url=http://www.hibernate.org/43.html]Open Session in View[/url]. Apanhei um pouco mas deu certo.
    Tem algumas coisas que eu fiz (copiei) e na realidade não sei direito pra que que serve. Gostaria da explicação de vocês. Ok?

Classe utilitária do hibernate de conexão com o banco

public class HibernateUtil {
	private static final SessionFactory sessionFactory;
	private static Log log = LogFactory.getLog(HibernateUtil.class);
	
	static
	{
		try
		{
			sessionFactory = new Configuration().configure().buildSessionFactory();
		}
		catch (Throwable ex)
		{
			System.out.println(ex.getMessage());
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
	public static final ThreadLocal session = new ThreadLocal();

    public static Session currentSession() {
        Session s = (Session) session.get();
        // Open a new Session, if this Thread has none yet
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }

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

Filtro que abre a sessão, chama o servlet/jsp e depois fecha a conexao

public class HibernateFiltro implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HibernateUtil.currentSession().beginTransaction();
				
		chain.doFilter(request, response);
				
		HibernateUtil.currentSession().getTransaction().commit();
		HibernateUtil.closeSession();
	}

	public void init(FilterConfig arg0) throws ServletException {

	}

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

Uma “action” chamada por um servlet

public class ListaContatos implements Action {	
	private Collection contatos;
		
	public Collection getContatos() {
		return contatos;
	}

	public void setContatos(Collection contatos) {
		this.contatos = contatos;
	}

	public void execute() throws Exception {
		Session sessao = HibernateUtil.currentSession();
				
		this.contatos = sessao.createQuery("from Contato").list();
				
	}
}

Tudo isso que postei está Ok. A duvida é :
Porque que tenho que usar uma ThreadLocal estática para abrir uma sessão ? E o que é uma ThreadLocal ?

Porque se no filtro eu fizer o seguinte:

   public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {		
	HibernateUtil.getSessionFactory().openSession().beginTransaction();
				
	chain.doFilter(request, response);
			
	HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();
	HibernateUtil.getSessionFactory().getCurrentSession().close();		
   }

e na na action :

   public void execute() throws Exception {
	Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
				
	this.contatos = sessao.createQuery("from Contato").list();				
   }

não funciona!
Porque a sessão que eu abro no filtro não é enxergada no servlet/jsp??

Desde já agradeço as colaborações

Mas qual é o erro que ocorre, quando vc não utiliza o threadlocal??

entao Ale_Doctor
quando eh feito um forward para um jsp, no momento q acesso o objeto, dah o lazyexceptio e diz q a sessao nao foi aberta ou já foi fechada…

Alguém sabe me dizer q com o threadlocal funciona?

faz uma busca no forum por OpenSessionInview, vc vai achar varias referencias.

[]'s

entao… eu ja fiz essa busca antes de criar o post…
Inclusive, no meu post tem o link para o OpenSessionInview no hibernate
minhas duvidas são relacionadas com OpenSessionInview, mas são mais especificas…