Spring + Hibernate + Lazy-Load  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
jr_klein
Entusiasta Java

Membro desde: 24/08/2005 16:12:45
Mensagens: 17
Offline

Pessoal,

Estou com um problema e gostaria de uma ajuda:

Tenho uma classe que possui mapeamento para outra classe via hibernate e utilizo lazy=true.
Possuo no meu web.xml configurado certinho o OpenSessionInViewFilter e funciona tudo correto também. Porém quando eu possuo um objeto que foi acessado em uma request e eu o coloco no contexto da aplicação (Faces), e tento acessar a propriedade lazy em uma outra request acontece o seguinte erro:






Este é o mesmo erro que acontecia quando não possuia o OpenSessionInViewFilter porém em todos os lugares que li a única coisa que era necessário fazer é colocar esse filtro no web.xml.


Alguém sabe algo a respeito
Kenobi
GUJ Master
[Avatar]

Membro desde: 14/11/2003 13:06:37
Mensagens: 1678
Localização: Brasil
Offline

Cara esse é um dos erros mais discutidos do Spring. A galera toda o tempo todo está se debatendo em cima do mesmo.

Eu acabei resolvendo o erro criando uma especialização do OpenSessionInViewFilter :




Depois acrescente no seu Web.xml:



Veja se funciona, senão, dê um tok

----------------------------------------------------------
SOA|EXPERT - http://www.soaexpert.com.br
SOA de um jeito simples e eficiente.
[WWW] [MSN] [ICQ]
Kenobi
GUJ Master
[Avatar]

Membro desde: 14/11/2003 13:06:37
Mensagens: 1678
Localização: Brasil
Offline

Só mais uma coisa, esqueci de mencionar :


this.getHibernateTemplate().merge(model);
this.getHibernateTemplate().flush();


Se tiver usando o HibernateTemplate, como acredito que esteja, faça após o merge (3.0), o flush na mão !!

----------------------------------------------------------
SOA|EXPERT - http://www.soaexpert.com.br
SOA de um jeito simples e eficiente.
[WWW] [MSN] [ICQ]
jr_klein
Entusiasta Java

Membro desde: 24/08/2005 16:12:45
Mensagens: 17
Offline

Cara...

Valeu pela resposta...
Tentei fazer o que você me falou mas não obtive sucesso.
Somente alterei o Filtro para aquele que você me mandou tendo em vista que a única diferença que notei entre ele e o original é que o seu o flushMode da session é AUTO.
Mas referente ao flush "na mão" não vi onde devo aplica-lo, pois até aonde conheço o merge seria como um saveOrUpdate mas o meu problema é com consultas... Ainda não estou nem salvando dados...

Mais uma vez obrigado pela ajuda.
Kenobi
GUJ Master
[Avatar]

Membro desde: 14/11/2003 13:06:37
Mensagens: 1678
Localização: Brasil
Offline

jr_klein wrote:Cara...

Valeu pela resposta...
Tentei fazer o que você me falou mas não obtive sucesso.
Somente alterei o Filtro para aquele que você me mandou tendo em vista que a única diferença que notei entre ele e o original é que o seu o flushMode da session é AUTO.
Mas referente ao flush "na mão" não vi onde devo aplica-lo, pois até aonde conheço o merge seria como um saveOrUpdate mas o meu problema é com consultas... Ainda não estou nem salvando dados...

Mais uma vez obrigado pela ajuda.


Viajei, acabei não vendo que era acesso.

Dê uma olhadinha nos seus relacionamentos, veja se está tudo correto

----------------------------------------------------------
SOA|EXPERT - http://www.soaexpert.com.br
SOA de um jeito simples e eficiente.
[WWW] [MSN] [ICQ]
marcelo_mococa
Virtual Machine Man
[Avatar]

Membro desde: 03/03/2005 10:03:32
Mensagens: 622
Localização: São Paulo
Offline

pq vc criou uma extensão para o filtro do spring? Eu sempre usei o próprio e nunca tive problemas com lazy. Tem algum outro motivo?

Marcelo Madeira - TCS
SCJP 1.5
SCWCD 1.4
blog

jr_klein
Entusiasta Java

Membro desde: 24/08/2005 16:12:45
Mensagens: 17
Offline

Na extensão somente foi modificado o flushMode...
Agora você me disse que sempre usou o do spring e nunca teve problemas...
Vc já tentou fazer o teste que eu falei??? Vc carrega um objeto em uma request e deixa ele na sessão... ai em outra request vc tenta capturar uma propriendade que é lazy e nunca havia sido carreada...

Esse é o problema que estou enfrentando... ainda ñ consegui resolve-lo...

Vlw
wellmattos
Debugger

Membro desde: 05/12/2003 10:46:16
Mensagens: 57
Offline

jr_klein eu não sei se entendi direito mas acho que o problema é que você fez o load do objeto e o colocou na sessão, e depois em outro request você tentou acessar o objeto e deu o problema do lazy. Se for isso acho que sei o que ocorreu, na verdade o OpenSessionViewFilter vai fechar a session após a criação do response a cada request, ou seja, quando a página jsp foi compilada e criada, como você não deve ter acessado a propriedade lazy do objeto antes desse momento o hibernate não realizou a busca das informações então ao acessar a propriedade lazy do objeto da sessão o proxy para buscar as informações vai dar problema porque a session do hibernate já foi fechada anteriormente.. para a solução acesse a propriedade após carregar o objeto.. só dar um get ou varrer a lista.. acho que não fui muito claro mais fica ai a ajuda..
carneiro
JavaEvangelist
[Avatar]

Membro desde: 07/04/2005 11:37:42
Mensagens: 328
Offline

HUmmm, nunca tinha parado para pensar nisso.

Se você acessar a propriedade lazy na mesma requisição onde você obteve o objeto, esta propriedade já ficará carrega no seu objeto, ou não? Aí você conseguiria acessar em outra request. Me refiro a algo do tipo:



Fazendo isso, como a categoria já teria sido carregada, poderia ser acessada em outra request.

Será que isso rola? Dá certo? Se bem que me parece uma solução meio porca...

Davi Luan Carneiro
Desenvolvedor JEE
[Email] [MSN]
Kenobi
GUJ Master
[Avatar]

Membro desde: 14/11/2003 13:06:37
Mensagens: 1678
Localização: Brasil
Offline

carneiro wrote:HUmmm, nunca tinha parado para pensar nisso.

Se você acessar a propriedade lazy na mesma requisição onde você obteve o objeto, esta propriedade já ficará carrega no seu objeto, ou não? Aí você conseguiria acessar em outra request. Me refiro a algo do tipo:



Fazendo isso, como a categoria já teria sido carregada, poderia ser acessada em outra request.

Será que isso rola? Dá certo? Se bem que me parece uma solução meio porca...


Seta o Lazy para false, vai resolver seu problema. Só tome cuidado com o tamanho do objeto para não onerar sua performance.

[]´s

----------------------------------------------------------
SOA|EXPERT - http://www.soaexpert.com.br
SOA de um jeito simples e eficiente.
[WWW] [MSN] [ICQ]
carneiro
JavaEvangelist
[Avatar]

Membro desde: 07/04/2005 11:37:42
Mensagens: 328
Offline

tem razão... viajei

Davi Luan Carneiro
Desenvolvedor JEE
[Email] [MSN]
jr_klein
Entusiasta Java

Membro desde: 24/08/2005 16:12:45
Mensagens: 17
Offline

Galera...
Eu não posso implementar as idéias q vocês deram como sugestão pois meus objetos podem disparar vários selects que não seriam necessários...
Tive que fazer uma "gambiarra" para quando ele tente acessar uma propriedade Lazy a sessão estiver fechada eu busco a nova sessão criada pelo OpenSessionInViewFilter...
Se alguém tiver alguma solução mais "elegante" aceito sugestões...
Brigadão
Insônia
Debugger
[Avatar]

Membro desde: 24/03/2005 23:06:33
Mensagens: 73
Offline

Olah!
Nao sei se alguem vai responder, mas eu gostaria de entender essa "gambiarra" para tentar aplica-la, pois estou passando pelo mesmo problema e ainda nao consegui soluciona-lo.

Poderia postar o codigo ou algo do tipo?

Obrigado!

SCJP, SCWCD
odairindena
Debugger

Membro desde: 12/09/2007 13:27:12
Mensagens: 57
Offline

tb estou com esta duvida, tem alguma forma de um objeto com lazy ficar na sessão do jsf e ser acessado por mais de um request ?
antoniopopete
Virtual Machine Man

Membro desde: 27/12/2006 02:37:31
Mensagens: 712
Localização: Salvador - BA
Offline

jr_klein wrote:Galera...
Eu não posso implementar as idéias q vocês deram como sugestão pois meus objetos podem disparar vários selects que não seriam necessários...
Tive que fazer uma "gambiarra" para quando ele tente acessar uma propriedade Lazy a sessão estiver fechada eu busco a nova sessão criada pelo OpenSessionInViewFilter...
Se alguém tiver alguma solução mais "elegante" aceito sugestões...
Brigadão


Voce encontrou uma solução mais elegante para isso???

Antonio Lazaro

[Email]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team