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
