Porque Lazy do Hibernate não Faz o seu trabalho?

6 respostas
arthurminarini

ola pessoal ha um tempo atras estava com problema com fechamento de sessão no hibernate pois havia muitos relacionamentos OneToMany e a sessão era fechada dava erro pois os OneToMany’s estavam ainda sendo populados. Em seguida adotei o padrão OSV (open session in view) recomendado pelo hibernate e configurei o xml da aplicação adicionando um filtro apontando pra classe que eu peguei no site do hibernate. Até ai tudo bem, voltei meus OneToMany(ante eu tinha comentado para funcionar) e funcionaou com o filter mas o problema é que mesmo sendo OneToMany Lazy ao verificar as bags ele esta populando tudo!!! ja sai espalhando lazy em tudo mas mesmo assim o bendito tras os objetos porque será? :shock:

6 Respostas

Lavieri

A questão é que c vc for verificar se ele ta populando, quando vc tentar verificar ele ja vai popular…

tente fazer assim:

passo 1… verifique se ele popula usando um GET …
passo 2… reinicie tudo… antes de dar o GET, de close na sessão, e depois de o GET, c ele não conseguir popular, é pq realmente esta sendo LAZY

arthurminarini

ok vou fazer o teste. mas os meus passo são o seguintes:

1 : .list();
2 : alert(dwr.util.toDescriptveString(usuarios,2))//no dwr

me retorna um jSon totalmente gigante carregado

arthurminarini

esta retornando isso pra mim no alert

[
     Conversion Error. See console log., 
 ]

no saida do servidor…

failed to lazily initialize a collection of role: br.com.empresa.eleicaocipa.pojo.EleicaoCipa.eleitores, no session or session was closed

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.empresa.eleicaocipa.pojo.EleicaoCipa.eleitores, no session or session was closed

at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)

at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)

at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)

at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)

at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)

at org.directwebremoting.convert.CollectionConverter.convertOutbound(CollectionConverter.java:182)

at org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:192)

at org.directwebremoting.convert.BasicObjectConverter.convertOutbound(BasicObjectConverter.java:189)

at org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:192)

at org.directwebremoting.convert.CollectionConverter.convertOutbound(CollectionConverter.java:206)

at org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:192)

at org.directwebremoting.extend.ScriptBufferUtil.createOutput(ScriptBufferUtil.java:56)

at org.directwebremoting.dwrp.BaseCallMarshaller$CallScriptConduit.addScript(BaseCallMarshaller.java:510)

at org.directwebremoting.extend.EnginePrivate.remoteHandleCallback(EnginePrivate.java:56)

at org.directwebremoting.dwrp.BaseCallMarshaller.marshallOutbound(BaseCallMarshaller.java:328)

at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:53)

at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)

at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:120)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)

at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)

at br.com.empresa.eleicaocipa.util.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:41)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)

at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)

at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)

at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)

at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)

at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)

at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)

at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)

at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)

at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380)

at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)

at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
fantomas

O erro indica que hibernate está tentando executar uma leitura sem ter uma seção aberta.

Verifique o controle de transações; no termino da transação o controle deve estar fechando a seção.

flws

arthurminarini

ok eu arrumei la pq eu implementei o filter e tinha no generic dao os closesession eu tirei e funcionou pois agora quem tem que fechar a sessão é a classe de filter. Mas como mencionei no titulo do topico veja como esta trazendo o meu list de eleição que tem mapeamento de onetomany com eleitores

[
     {
     dataFinal:Thu Feb 19 2009 00:00:00 GMT-0300 (Hora oficial do Brasil), 
     dataInicial:Thu Feb 19 2009 00:00:00 GMT-0300 (Hora oficial do Brasil), 
     eleitores:[Object, Object, Object, Object, Object, Object, Object, ...], //não era para ele trazer estes objetos
     horaFinal:Thu Jan 01 1970 18:30:00 GMT-0300 (Hora oficial do Brasil), 
     horaInicial:Thu Jan 01 1970 09:00:00 GMT-0300 (Hora oficial do Brasil), 
     idColigada:{cnpj:11.111.111..., idColigada:10, idUsuario:Object, nome:Treinamento, status:ATIVO, }, 
     idEleicao:20, 
     idUsuario:{idUsuario:8, login:administrador, nomeUsuario:Administrador, senha:79f0f40eed..., status:ATIVO, }, 
     nome:CIPA treinamento, 
     status:VOTACAO, 
   }, 
 ]

veja na classe eleição como esta

@RemoteProperty
    @OneToMany(mappedBy="idEleicao")//por default onetomany é lazy mas coloquei tbm pra testar forçando o lazy e deu a mesma coisa
    private List<Eleitor> eleitores;
    @RemoteProperty
    public List<Eleitor> getEleitores() {
        return eleitores;
    }
    public void setEleitores(List<Eleitor> eleitores) {
        this.eleitores = eleitores;
    }
arthurminarini

duvida :?: ! será que esta certo ele trazer

eleitores:[Object, Object, Object, Object, Object, Object, Object, …]

ou teria que ser

eleitores:[] ?

reparei que se eu colocar EAGER ao inves de trazer uma eleição com esses objetos ele repete varias vezes a mesma eleição talves do geito que esta esta sendo lazy!?

Criado 19 de fevereiro de 2009
Ultima resposta 19 de fev. de 2009
Respostas 6
Participantes 3