Boa noite galera estou com um problema em ao carregar minha lista de entity no datatable quando tem uma relação 1 para N está dando a seguinte mensagem
failed to lazily initialize a collection of role: br.com.crm.orm.entity.Categoria.produtoCollection, no session or session was closed
Resoveu para 90% dos casos quando mesmo assim não funciona infelizmente no metodo que eu carrego a minha lista de produtos por exemplo, no mesmo metodo e do size na minha collection que esta dentro do produto só para obrigar o hibernate carregar a lista.
Espero ter ajudado
A
apalmeira
Estou com o mesmo problema!
Como eu faço para não fechar a sessão?
Vlw
D
djemacao
apalmeira:
Estou com o mesmo problema!
Como eu faço para não fechar a sessão?
Vlw
Use o mesmo que o amigo acima configurou mas, delegue as transações para o Spring. Desta forma, não terá problemas como o colega acima citou.
A
apalmeira
Eu não utilizo o Spring, somente jsf e jpa.
LPJava
eu conseguir resolver com esse post: http://community.jboss.org/wiki/OpenSessioninView é o melhor que temos, e resolve mesmo, 10min tinha tudo resolvido. estou usando hibernate + jsf com o tipo do elemento LAZY. Mudar para EAGER so se for ultima opcao.
A
apalmeira
Obrigado!
Poderia postar a classe HibernateUtil e a HibernateSessionRequestFilter? Não sei se entendi direito, mas me parece que são só essas duas mesmo, estou certo?
Estou com alguns problemas no sistema da empresa, e ainda estou aprendendo jpa/hibernate. Para ser sincero estou com bastante dificuldades para utilizar o Lazy e o pool de conexoes.
Vou começar um curso de hibernate na Caelum no próximo mes, o problema é que tenho que apresentar um modulo do sistema para um cliente, e sem o Lazy fica mto lento.
Valeu
A
apalmeira
Olá,
Encontrei esse exemplo aqui no Guj!
Nesse caso a pessoa utiliza o Hibernate e retona um sessionFactory. O que eu devo retornar com o JPA?
Outra coisa, preciso alterar alguma coisa nas minhas classes? hoje eu faço assim:
EntityManagerFactory emf = EntityManagerProvider.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
......
Exemplo localizado no Guj:
publicclassHibernateSessionRequestFilterimplementsFilter{privatestaticLoglog=LogFactory.getLog(HibernateSessionRequestFilter.class);privateSessionFactorysf;publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{try{sf.getCurrentSession().beginTransaction();chain.doFilter(request,response);sf.getCurrentSession().getTransaction().commit();}catch(StaleObjectStateExceptionstaleEx){throwstaleEx;}catch(Throwableex){ex.printStackTrace();try{if(sf.getCurrentSession().getTransaction().isActive()){sf.getCurrentSession().getTransaction().rollback();}}catch(ThrowablerbEx){log.error("Could not rollback transaction after exception!",rbEx);}thrownewServletException(ex);}}publicvoidinit(FilterConfigfilterConfig)throwsServletException{log.debug("Initializing filter...");log.debug("Obtaining SessionFactory from static HibernateUtil singleton");sf=HibernateUtil.getInstace().getSessionFactory();sf.openSession();}publicvoiddestroy(){}publicbooleanisLoggable(LogRecordrecord){thrownewUnsupportedOperationException("Not supported yet.");}}
Poderia postar a classe HibernateUtil e a HibernateSessionRequestFilter? Não sei se entendi direito, mas me parece que são só essas duas mesmo, estou certo?
Estou com alguns problemas no sistema da empresa, e ainda estou aprendendo jpa/hibernate. Para ser sincero estou com bastante dificuldades para utilizar o Lazy e o pool de conexoes.
Vou começar um curso de hibernate na Caelum no próximo mes, o problema é que tenho que apresentar um modulo do sistema para um cliente, e sem o Lazy fica mto lento.
Valeu
bem, esse HibernateUtil é a na verdade a fábrica de session, no meu caso ele fica dentro de um DAO generico. Vou postar o meu código de teste que implementei antes de ir colocar na aplicacao real veja:
packagebr.com.filtro;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;importorg.hibernate.SessionFactory;importorg.hibernate.StaleObjectStateException;importbr.com.dao.DAO;publicclassHibernateSessionRequestFilterimplementsFilter{privatestaticLoglog=LogFactory.getLog(HibernateSessionRequestFilter.class);privateSessionFactorysf;publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{try{System.out.println("Starting a database transaction");sf.getCurrentSession().beginTransaction();// Call the next filter (continue request processing)chain.doFilter(request,response);// Commit and cleanuplog.debug("Committing the database transaction");sf.getCurrentSession().getTransaction().commit();}catch(StaleObjectStateExceptionstaleEx){log.error("This interceptor does not implement optimistic concurrency control!");log.error("Your application will not work until you add compensation actions!");// Rollback, close everything, possibly compensate for any permanent changes// during the conversation, and finally restart business conversation. Maybe// give the user of the application a chance to merge some of his work with// fresh data... what you do here depends on your applications design.throwstaleEx;}catch(Throwableex){// Rollback onlyex.printStackTrace();try{if(sf.getCurrentSession().getTransaction().isActive()){log.debug("Trying to rollback database transaction after exception");sf.getCurrentSession().getTransaction().rollback();}}catch(ThrowablerbEx){log.error("Could not rollback transaction after exception!",rbEx);}// Let others handle it... maybe another interceptor for exceptions?thrownewServletException(ex);}}publicvoidinit(FilterConfigfilterConfig)throwsServletException{//log.debug("Initializing filter...");// log.debug("Obtaining SessionFactory from static HibernateUtil singleton");sf=DAO.getSessionfactory();}publicvoiddestroy(){}}
EntityManagerFactory emf = EntityManagerProvider.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
e pego o EntityManagerFactory nos MBs, no seu arquivo você utiliza o SessionFactory! Eu poderia utilizar o EntityManagerFactory ou deveria usar outra coisa?