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]
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 