Você pode utilizar o antigo esquema de HibernateUtils (Factory) que add a session na ThreadLocal, então no Filter (OpenSessionView) você recupera pelo HibernateUtils.
package br.com.jsf2.dals.orm;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static final SessionFactory sessionFactory;
private static final ThreadLocal<Session> sessions = new ThreadLocal<Session>();
static {
try {
Configuration cfg = new Configuration();
sessionFactory = cfg.configure().buildSessionFactory();
} catch (Throwable ex) {
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}
/**
* Realiza a operação de devolução de uma sessão.
* @return Session Sessão falsa
*/
public static Session getSession() {
if(sessions.get() == null) openSession();
return sessions.get();
}
/**
* Realiza a operação de fechamento de uma sessão.
* @return Sessão verdadeira
*/
public static void closeSession() {
if(sessions.get() != null) {
//sessions.get().close();
sessions.set(null);
}
}
/**
* Realiza a operação abertura de uma sessão, para ser chamado pelo filtro.
* @return Session Sessão verdadeira
*/
public static Session openSession() {
Session s = sessionFactory.openSession();
sessions.set(s);
return s;
}
}
E no Filter:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)
throws IOException, ServletException {
Session session = HibernateUtils.getSession();
Transaction transaction = session.getTransaction();
try {
// Sessão do Hibernate
session.beginTransaction();
fc.doFilter(req, res);
transaction.commit();
} catch (Exception ex) {
transaction.rollback();
ex.printStackTrace();
} finally {
HibernateUtils.closeSession();
}
/* Verifica se a exception é uma instancia de GTException e se a referência está inicializada.
* Caso seja, é eviada como GTException senão irá como ServletException.
*/
}