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

34 respostas
V

Gostaria de saber se existe alguma maneira mais facil para mostrar em um JSP os dados de um objeto que foi trazido pelo hibernate, sem precisar ter que criar um novo e pegar todos os dados dele.

Eu sei que se não der um close() na session da certo. Mas qual é o impacto disso na aplicação?

Ah! Junto com o hibernate estou usando c3p0.

Agradeço desde ja a atenção de todos.

34 Respostas

F

Você não precisa criar novos objetos, pode utilizar aqueles que o Hibernate retorna sem problemas.

V

Eu começei a criar novos objetos porque as vezes parecia uma exception que dizia que não conseguia resolver e como root case dizia no session.

V

Recebo esse erro ao tentar sem finalizar a sessão.

org.apache.jasper.JasperException: javax.el.ELException: Error reading 'id' on type MZSuporte.model.Monitor$$EnhancerByCGLIB$$e617e536
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

javax.el.ELException: Error reading 'id' on type MZSuporte.model.Monitor$$EnhancerByCGLIB$$e617e536
	javax.el.BeanELResolver.getValue(BeanELResolver.java:66)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:925)
	org.apache.jsp.admin.ok.okMonitor_jsp._jspx_meth_html_005fhtml_005f0(okMonitor_jsp.java:138)
	org.apache.jsp.admin.ok.okMonitor_jsp._jspService(okMonitor_jsp.java:64)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
	org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:60)
	org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
	org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
	MZSuporte.model.Monitor$$EnhancerByCGLIB$$e617e536.getId(<generated>)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:925)
	org.apache.jsp.admin.ok.okMonitor_jsp._jspx_meth_html_005fhtml_005f0(okMonitor_jsp.java:138)
	org.apache.jsp.admin.ok.okMonitor_jsp._jspService(okMonitor_jsp.java:64)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

Antes de setar esse variavel eu faço um read pelo Id. Então recebo esse erro.
Eu sou obrigado então a deixar a session aberta se eu não quiser setar td em um novo objeto??
Qual o impacto disso p a aplicação?

Mto obrigado a todos

V

Cara essa exception só acontece quando vc busca alguma coisa que não foi carregada enquanto a session do hibernate estava aberta.
O metodo simples de fazer a session ficar aberta durante a request inteira (ou seja: até tudo ser renderizado) é colocando um filter que abre a session, chama chain.doFilter(), e depois fecha a Session.

Mas isso depende muito do teu dev environment, manda mais info sobre quais tecnologias tais a usar:

  • se tah num ejb container ou num servlet container
  • se usa ejb ou nao, jpa ou nao

talvez posso te ajudar se me der mais info

Valeu

V

Não uso EJB,

Estou usando Struts + Hibernate, Estou mapeando com Annotations, utilizo DAO generico, DAOFactory e HibernateUtil. Tambem uso JSTL e DisplayTag Library. Quer mais alguma informação ou quer ver algum código?/

Vlw

Abss

V

isso é o que vc deve fazer:

https://www.hibernate.org/43.html

se vc tivesse num ambiente ejb3(jboss) aí deveria carregar todos os objetos e associacoes necessarias ANTES do metodo do ejb retornar.

valeu

V

Ok,

Vou dar uma lida e tentar fazer.

Só mais uma duvida, qual o problema, o impacto de deixar uma session aberta?? e usando c3p0 ele não encerra sozinho??

Vlw

Abss

V

cara o c3po é um thread pool de connections.

quem fecha uma connection( e libera-a pro thread pool) é o hibernate quando vc chama session.commit();

obviamente deixando a session aberta por muito tempo vai deixar a connection aberta pelo mesmo tempo.

ou seja, no seu Filter: abra a session do hibernate no inicio da request (beginTransaction) e feche a session no fim da request(commitTransaction ou rollback).

lembrando q se vc nao colocar o commit ou rollback no finnaly pode ser q a connection fique aberta se ocorre alguma exception

valeu

V

Valew pela ajuda.

Vou tentar.

Abss

V

se der certo coloca o titulo como RESOLVIDO?

V

Pode deixar.

Valew pela ajuda

Abss

V

Parece que o problema não é exatamente esse, pois quando eu excluo eu não tava fechando a sessão e o erro tambem acontece, só que um pouco diferente.

O código para excluir é esse:

pc = dao.getDesktopDAO().read(pc.getId());
                request.setAttribute("pc", pc);
                dao.beginTransaction();
                dao.getDesktopDAO().delete(pcform.getPc());
                dao.commit();
                String acao = "excluido";
                request.setAttribute("acao", acao);
                return mapping.findForward("okpc");

Ai ele da esse erro:

org.apache.jasper.JasperException: An exception occurred processing JSP page /admin/ok/okPC.jsp at line 64

61:             <table border="0" align="center">
62:                 <tr>
63:                     <td><b>Numero:</b></td>
64:                     <td>${pc.id}</td>
65:                 </tr>
66:                 <tr>
67:                     <td><b>Memória:</b></td>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

javax.el.ELException: Error reading 'id' on type MZSuporte.model.Desktop$$EnhancerByCGLIB$$34a1a3fc
	javax.el.BeanELResolver.getValue(BeanELResolver.java:66)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:925)
	org.apache.jsp.admin.ok.okPC_jsp._jspx_meth_html_005fhtml_005f0(okPC_jsp.java:164)
	org.apache.jsp.admin.ok.okPC_jsp._jspService(okPC_jsp.java:76)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [MZSuporte.model.Desktop#2000]
	org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:377)
	org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:79)
	org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:72)
	org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
	org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
	MZSuporte.model.Desktop$$EnhancerByCGLIB$$34a1a3fc.getId(<generated>)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:925)
	org.apache.jsp.admin.ok.okPC_jsp._jspx_meth_html_005fhtml_005f0(okPC_jsp.java:164)
	org.apache.jsp.admin.ok.okPC_jsp._jspService(okPC_jsp.java:76)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

Estou achando que pode ser algo no modelo, da uma olhada por favor. Oque eu posso mudar??

@Entity
@Table(name="desktop")
public class Desktop implements Serializable {

    @Id
    private String id;

    private String memoria;

    private String hd;

    private String processador;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "fabricante")
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Fabricante fabricante;

    private String cod_serv;

    @Column(name = "eti_serv")
    private String cod_eti;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "modelo" )
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private ModeloPc modelo;

Muito obrigado pela atenção.

Att,

Vinicius Roberto

V

https://www.hibernate.org/116.html#A4
da uma olhada nisso

Vinicius vc colocou o codigo que inicia e fecha a transaction num filter?

V

Entendi mais ou menos oque me mostrou.

Não entendi oque ele quis dizer direito com

se você tenta carregar um non-proxied(?) objeto com session.load() ou você carrega um proxied(?) objeto e depois acessa o proxy(?).

O codigo para iniciar e fechar uma transação esta no DaoFactory.

Vou postar aqui e vou postar tambem o hibernate util.

public class DaoFactory {

    private final Session session;
    private Transaction transaction;

    public DaoFactory() {
        session = HibernateUtil.getSession();
    }

    public void beginTransaction() {
        this.transaction = this.session.beginTransaction();
    }

    public void commit() {
        this.transaction.commit();
        this.transaction = null;
    }

    public boolean hasTransaction() {
        return this.transaction != null;
    }

    public void rollback() {
        this.transaction.rollback();
        this.transaction = null;
    }

    public void close() {
        this.session.close();
    }

//Daos

Hibernate Util

public class HibernateUtil {

    private static SessionFactory factory;

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

    public static Session getSession() {
        return factory.openSession();
    }
}

Muito obrigado pela ajuda

V

cara vc precisa dum servlet filter, pq a vida do servlet nao dura ateh o fim do render da jsp, acho q eh por isso q ainda da o erro

public class HibernateSessionFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) resp;
try {
		util.createSession();
		chain.doFilter(request, response);// aqui dentro  vai rolar teu codigo, vc abre e commita ou rollback a transaction
	} finally {
                     // aqui o render ja acabou
		try {
                           if(util.isTransactionAtiva()) util.rollback(); // se for true aqui, com certeza deu merda, 
			util.closeSession();
		} catch (Exception exc) {
			LOGGER.error("Error Closing", exc);
		}
	}
}

valeu

V

Ok

Implementei assim:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        DaoFactory dao = new DaoFactory();

        try {            
            chain.doFilter(request, response);
        } finally {

            try {
                if (dao.hasTransaction()) {
                    dao.rollback();
                }
                dao.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Implementei assim esta correto??

E ele pediu p inserir esse metodo? O que é?

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

Bom, como observei e vi que era parecido com o do link q você me enviou primeiro, fiz o do primeiro link:

Só que nao esta dando certo ele retorna esse erro:

javax.servlet.ServletException: org.hibernate.HibernateException: No CurrentSessionContext configured!
MZSuporte.dao.DaoInterceptor.doFilter(DaoInterceptor.java:43)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

O que ha de errado?

public class DaoInterceptor implements Filter {

    //Para que serve?
    public boolean isLoggable(LogRecord record) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    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) {
            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 init(FilterConfig filterConfig) throws ServletException {
        sf = HibernateUtil.getSession();
    }

    public void destroy() {
    }
}

Valew

V

Vitenho

Muito obrigado pela sua ajuda. Valew mesmo. Deu tudo certo.

Foi só criar o filtro mesmo:

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() {
    }
}

Só gostaria que me tirasse duas duvidas por favor:

1 - Reparei que no Filter não ha nenhum momento que ele da um close na session. Esta certo??

2 - Antes de eu excluir uma linha, eu faço um read nele e seto como atributo, para poder pegar na JSP. Só que após excluir, ele só retorna o Id. Como faço para ele exibir tudo?

Muito Obrigado pela ajuda. Foi 10.

V

cara nao entendi sua pergunta numeor 2, mas a o codigo que te passei tem um finally q fecha a sessao

try {
util.createSession();
chain.doFilter(request, response);// aqui dentro vai rolar teu codigo, vc abre e commita ou rollback a transaction

// nota que eu nao tenho catch, o q explodir que exploda!
}

FINALLY!!!!

 finally {
// aqui o render ja acabou
try {
if(util.isTransactionAtiva()) util.rollback(); // se for true aqui, com certeza deu merda,



util.closeSession();// AQUI FECHA A SESSAO




} catch (Exception exc) {
LOGGER.error("Error Closing", exc);
}
}
}

FLW BROW

V

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

V

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

J

Ola

estou tendo o msm problema.

só que , apos colocar o Filtro , da o seguinte erro:

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)

meu filtro e esse:

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

}

sera q esqueci de botar alguma coisa?

V

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

posta seu HibernateUtil para ver por favor.

J

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

posta seu HibernateUtil para ver por favor.

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

V

Tenta implementar os dois assim:

Evite complicar muito:

Hibernate Util:

public class HibernateUtil {

    private static SessionFactory factory;

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

    public static SessionFactory getSession() {
        return factory;
    }

Filtro

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() {
    }
}

E no seu DaoFactory coloque esse contrutor:

public class DaoFactory {

    private final Session session;

    public DaoFactory() {
        session = HibernateUtil.getSession().getCurrentSession();
    }

O meu esta exatamente assim e esta funcionando perfeitamente.

V

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

V

Prontinho :wink:

J

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:

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)
V

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

leia os comentarios

flw

A

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

V

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

A

Uso xhtml!

Vlw vou testar!

A

É mesma configuração para xhtml?

M

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>
Criado 23 de julho de 2009
Ultima resposta 15 de mai. de 2012
Respostas 34
Participantes 6