É que eu implementei o primeiro filtro que você me enviou, do site do hibernate.
E a respeito da segunda pergunta, ja consegui resolver, valew. É que na tela de confirmação eu precisava mostrar os dados do item excluido, só que como ja não existia mais, não vinha nenhum resultado. Então passei a criar um outro objeto antes de excluir.
só que , apos colocar o Filtro , da o seguinte erro:
[code]exception
javax.servlet.ServletException: javax.servlet.ServletException: failed to lazily initialize a collection of role: camara.bean.Cliente.os, no session or session was closed
camara.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:63)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
[/code]
meu filtro e esse:
[code]public class HibernateSessionRequestFilter implements Filter {
private static Log log = LogFactory.getLog(HibernateSessionRequestFilter.class);
private SessionFactory sf;
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
try {
sf.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
sf.getCurrentSession().getTransaction().commit();
} catch (StaleObjectStateException staleEx) {
throw staleEx;
} catch (Throwable ex) {
ex.printStackTrace();
try {
if (sf.getCurrentSession().getTransaction().isActive()) {
sf.getCurrentSession().getTransaction().rollback();
}
} catch (Throwable rbEx) {
log.error("Could not rollback transaction after exception!", rbEx);
}
throw new ServletException(ex);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
log.debug("Initializing filter...");
log.debug("Obtaining SessionFactory from static HibernateUtil singleton");
sf = HibernateUtil.getInstace().getSessionFactory();
sf.openSession();
}
public void destroy() {}
public boolean isLoggable(LogRecord record) {
throw new UnsupportedOperationException("Not supported yet.");
}
fiz um debug aki é vi que quando ele esta na metade da consulta(commit), causa uma excesseção do tipo Throwable
causando o seguinte erro no Log:
30/07/2009 19:07:50 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
org.hibernate.TransactionException: Transaction not successfully started
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:131)
at camara.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:34)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
depois gera um Lazy:
[code]javax.servlet.ServletException: javax.servlet.ServletException: failed to lazily initialize a collection of role: camara.bean.Cliente.os, no session or session was closed
camara.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:47)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
desculpe minha ignorância, eu sou novo no java e jsf e minhas dúvidas persistem mesmo após ler o post, espero que possam me ajudar.
na parte de cadastrar e listar ta tudo OK, mas sempre que tento deletar ou update estoura erro de duas conexões abertas e se eu a fecho, estoura erro de sessão fechada . nisso, eu encontrei esse post e acho que me serve.
eu não estou conseguindo visualizar onde que é feita a chamada do Filtro ou aonde que ele é chamado. alguém pode me ajudar?? to postando meu HibernateUtil e meu GenericDao.
o filtro que eu copiei com base no que li aqui no post.
public class FiltroDao implements Filter{
private SessionFactory sf;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
try {
sf.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
sf.getCurrentSession().getTransaction().commit();
} catch (StaleObjectStateException staleEx) {
// TODO: handle exception
staleEx.printStackTrace();
throw staleEx;
} catch (Throwable ex){
ex.printStackTrace();
try {
if(sf.getCurrentSession().getTransaction().isActive())
sf.getCurrentSession().getTransaction().rollback();
} catch (Throwable rbEx) {
// TODO: handle exception
rbEx.printStackTrace();
}
throw new ServletException(ex);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
sf = HibernateUtil.getSessionFactory();
}
}
meu HibernateUtil
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration().configure("config/postgresql_hibernate.cfg.xml").buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
meu GenericDao
public class GenericDao {
Session s;
Transaction t;
Query query;
public void create(Object o)throws Exception{
s = HibernateUtil.getSessionFactory().openSession();
t = s.beginTransaction();
s.save(o);
t.commit();
s.close();
}
public void excluir(Object o)throws Exception{
s = HibernateUtil.getSessionFactory().openSession();
t = s.beginTransaction();
s.delete(o);
t.commit();
s.close();
}
public void update(Object o)throws Exception{
s = HibernateUtil.getSessionFactory().openSession();
t = s.beginTransaction();
s.update(o);
t.commit();
s.close();
}
public List<Cliente> findByName(String nome) throws Exception{
s = HibernateUtil.getSessionFactory().openSession();
Criteria cc = s.createCriteria(Cliente.class);
cc.add(Expression.like("nome", "%" + nome + "%"));
List<Cliente> lc = cc.list();
s.close();
return lc;
}
public Cliente findByCod(Integer cod)throws Exception {
// TODO Auto-generated method stub
s = HibernateUtil.getSessionFactory().openSession();
Cliente c = (Cliente) s.get(Cliente.class, cod);
/*query = s.createQuery("from Cliente where idcliente=:cod");
query.setInteger("cod", new Integer(cod));
Cliente c = (Cliente) query.uniqueResult();
*/
// s.close();
return c;
}