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