Criar a session do hibernate em filtro é recomendado? [Resolvido]

Saldações galera, eutou fazendo um projetinho WEB aqui e uma maneira que achei de limpar os meus códigos é criar a Session em um filtro, porem estava tendo algus problemas com operações seguidas, por exemplo:

Usuario u = usuarioDao.findByID(1);
u.setNome("Alterando o nome");
usuarioDao.update(u);

Após a execução desta rotina ele estava me lançando uma exception falando que a chave estava sendo violada…
Pesquisei a respeito e isto aparentemente acontece em situações em que a session não foi fechada…

O código do filtro é este:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.hibernate.SessionFactory;

public class ConnectionHibernateFilter implements Filter{

	private SessionFactory sessionFactory;
	
	@Override
	public void init(FilterConfig config) throws ServletException {
		this.sessionFactory = HibernateUtil.getSessionFactory();
	}
	
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
		try{
			this.sessionFactory.getCurrentSession().beginTransaction();
			chain.doFilter(servletRequest, servletResponse);
			this.sessionFactory.getCurrentSession().getTransaction().commit();
			this.sessionFactory.getCurrentSession().close();
		}catch (Throwable e) {
			try{
				if(this.sessionFactory.getCurrentSession().getTransaction().isActive()){
					this.sessionFactory.getCurrentSession().getTransaction().rollback();
				}
			}catch (Throwable t) {
				t.printStackTrace();
			}
			throw new ServletException(e);
		}
	}

	@Override
	public void destroy() {}
}

Isso é semanticamente correto?
ou teria melhor alternativa?

Agradeço des de já…
Att, Renan Johannsen de Paula

Estive pesquisando mais aqui…

vi alguns modelos de dao generics parecidos com o que eu criei…
e a diferença é que eles utilizan o session.flush() após operações que precizem sincronizar dados com o bd antes de se fechar a session…

acho que incrementando o meu códico com tal linha não teriei mais problemas…

mas ainda fica ai a questão…

Utilizar um filtro de conexão é semanticamente correto?
Att

[quote=renanjp]Saldações galera, eutou fazendo um projetinho WEB aqui e uma maneira que achei de limpar os meus códigos é criar a Session em um filtro, porem estava tendo algus problemas com operações seguidas, por exemplo:

Usuario u = usuarioDao.findByID(1);
u.setNome("Alterando o nome");
usuarioDao.update(u);

Após a execução desta rotina ele estava me lançando uma exception falando que a chave estava sendo violada…
Pesquisei a respeito e isto aparentemente acontece em situações em que a session não foi fechada…

O código do filtro é este:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.hibernate.SessionFactory;

public class ConnectionHibernateFilter implements Filter{

	private SessionFactory sessionFactory;
	
	@Override
	public void init(FilterConfig config) throws ServletException {
		this.sessionFactory = HibernateUtil.getSessionFactory();
	}
	
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
		try{
			this.sessionFactory.getCurrentSession().beginTransaction();
			chain.doFilter(servletRequest, servletResponse);
			this.sessionFactory.getCurrentSession().getTransaction().commit();
			this.sessionFactory.getCurrentSession().close();
		}catch (Throwable e) {
			try{
				if(this.sessionFactory.getCurrentSession().getTransaction().isActive()){
					this.sessionFactory.getCurrentSession().getTransaction().rollback();
				}
			}catch (Throwable t) {
				t.printStackTrace();
			}
			throw new ServletException(e);
		}
	}

	@Override
	public void destroy() {}
}

Isso é semanticamente correto?
ou teria melhor alternativa?

Agradeço des de já…
Att, Renan Johannsen de Paula[/quote]

Resposta aqui:

https://community.jboss.org/wiki/OpenSessionInView?_sscc=t

Fala brother, blz? Então o filtro é utilizado para gerenciar as session do hibernate, garantindo que as conexões abertas serão fechadas e garantindo o baixo acoplamento. Da uma lida em injeção de dependência, inversão de controle e baixo acoplamento… Espero ter ajudado :slight_smile: