Erro Hibernate Filter + Lazy Init + Session Closed [RESOLVIDO]

É 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.

brow
se eu te falar que esse problema afeta 10 projetos em cada 10 projetos, vc nao acredita… ehheh

agora tu tambem ja pode ajudar a galera que tah pegando lazy exception

valeu

Ola

estou tendo o msm problema.

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.");
}

}[/code]

sera q esqueci de botar alguma coisa?

Aparentemente não, o meu só não tem o open session.

posta seu HibernateUtil para ver por favor.

[quote=vinicius_roc]Aparentemente não, o meu só não tem o open session.

posta seu HibernateUtil para ver por favor.[/quote]

hibernateUtil

public class HibernateUtil { private static HibernateUtil me; private SessionFactory sessionFactory; public HibernateUtil() { sessionFactory = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory(); } public Session getSession(){ Session toReturn = sessionFactory.openSession(); //toReturn.beginTransaction(); return toReturn; } public static HibernateUtil getInstace(){ if (me==null){ me = new HibernateUtil(); } return me; } public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } }

Tenta implementar os dois assim:

Evite complicar muito:

Hibernate Util:

[code]public class HibernateUtil {

private static SessionFactory factory;

static {
    Configuration conf = new AnnotationConfiguration();
    conf.configure();
    factory = conf.buildSessionFactory();
}

public static SessionFactory getSession() {
    return factory;
}[/code]

Filtro

[code]public class DaoInterceptor implements Filter {

private SessionFactory sf;

public boolean isLoggable(LogRecord record) {
    throw new UnsupportedOperationException("Not supported yet.");
}

    public void init(FilterConfig filterConfig) throws ServletException {
    sf = HibernateUtil.getSession();
}

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) {
        staleEx.printStackTrace();
        throw staleEx;
    } catch (Throwable ex) {
        ex.printStackTrace();
        try {
            if (sf.getCurrentSession().getTransaction().isActive()) {
                sf.getCurrentSession().getTransaction().rollback();
            }
        } catch (Throwable rbEx) {
            rbEx.printStackTrace();
        }
        
        throw new ServletException(ex);
    }
}

public void destroy() {
}

}[/code]

E no seu DaoFactory coloque esse contrutor:

[code]public class DaoFactory {

private final Session session;

public DaoFactory() {
    session = HibernateUtil.getSession().getCurrentSession();
}[/code]

O meu esta exatamente assim e esta funcionando perfeitamente.

vinicius acho q seria legal vc colocar o topico para:
Erro Hibernate Filter + Lazy Init + Session Closed [RESOLVIDO]

duvida hibernate pode ser 5 bilhoes de coisas heuaaueheua

flw

Prontinho :wink:

agradeço ao vinicius por suas dicas

mas ainda nao esta funcionando

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)

[/code]

http://blog.sherifmansour.com/?p=236

leia os comentarios

flw

vitenho,

Como eu faço para exibir uma mensagem o para o usuário, ou direcionar para uma página de erro, caso ocorra algume problema no TRY?

Vlw

vc ta usando xhtml ou jsp?

pode colocar isso no web xml

<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/errorThrowable.jsp</location> </error-page>

e no catch faz throw denovo pra ir pra essa pagina

Uso xhtml!

Vlw vou testar!

É mesma configuração para xhtml?

falaei galera, tudo bem!?!?

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;
	}

meu hibernate.cfg.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration 
          PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

  <session-factory>
  
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/*</property>
    <property name="hibernate.connection.username">*******</property>
    <property name="hibernate.connection.password">******</property>
    <property name="hibernate.current_session_context_class">thread</property> 
   
    <mapping class="entity.Cliente" />
    <mapping class="entity.Contatos" />
    <mapping class="entity.Endereco" />
 
 
 </session-factory>
 
</hibernate-configuration>