Set e problemas com Lazy

7 respostas
smorigo

Bom dia pessoal, estou desenvolvendo uma aplicação utilizando MyFaces/Hibernate, no momento em que meu usuário faz login na aplicação mantenho em Session um bean com as informações do usuário.

Em uma determinada pagina acesso esse meu Session Bean e recupero um atributo chamado Exportador nesse objeto tenho um Set chamado Produtos.

Meu Mapeamento:

<set name="produtos" table="TB_EXPORTADOR_PRODUTO" lazy="true">	
		    <key column="CODIGO_EXPORTADOR"/>		     
			<many-to-many class="br.com.fts.exp.bean.Produto" column="CODIGO_PRODUTO"/>
		</set>

E quando tento acessar este Set boom recebo uma exception para o problema de Lazy.

26/03/2006 11:33:36 org.hibernate.LazyInitializationException <init>
SEVERE: failed to lazily initialize a collection of role: br.com.fts.exp.bean.Exportador.produtos, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.fts.exp.bean.Exportador.produtos, no session or session was closed

Para controlar minhas transações estou usando uma implementação do Mauricio Linhares dentro de um Filtro que está postada aqui no GUJ no tutorial de Hibernate.

Alguém poderia me dar uma sugestão?

7 Respostas

Mauricio_Linhares

Provavelmente porque você está carregando o objeto Exportador em uma requisição e indo mexer no set em OUTRA requisição.

(tenho a ligeira impresão de ter respondido isso antes…)

A

Velho, tive exatamente o mesmo problema aqui na minha aplicacao.No forum do hibernate os caras disseram que quando vc quer fazer o lazy load de uma colecao de algum objeto depois de ja ter fechado a sessao vc tem que recolocar esse objeto na sessao com o seguinte metodo:

session.lock(seuObjeto,LockMode.NONE);

So que fiz isso e recebi a seguinte excessao:

Exception in thread "main" org.hibernate.HibernateException: reassociated object has dirty collection reference (or an array)
	at org.hibernate.event.def.OnLockVisitor.processCollection(OnLockVisitor.java:67)
	at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:104)
	at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:64)
	at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:58)
	at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:129)
	at org.hibernate.event.def.AbstractReassociateEventListener.reassociate(AbstractReassociateEventListener.java:75)
	at org.hibernate.event.def.DefaultLockEventListener.onLock(DefaultLockEventListener.java:57)
	at org.hibernate.impl.SessionImpl.lock(SessionImpl.java:472)
	at daten.xmanager.model.dao.impl.HibernateComputadorDAO.carregarDependencia(HibernateComputadorDAO.java:55)
	at daten.xmanager.model.dao.impl.HibernateComputadorDAO.carregarDependencia(HibernateComputadorDAO.java:47)
	at daten.xmanager.negocio.models.ComputadorBO.carregarDependencia(ComputadorBO.java:56)
	at daten.xmanager.negocio.SistemaFacade.listarPerifericosComputador(SistemaFacade.java:97)
	at daten.xmanager.negocio.SistemaFacade.main(SistemaFacade.java:193)

Se alguem puder nos ajudar vai ser muito bom. Procurei no google por essa excessao mas nao encontrei nada.

Alberto

A

ao inves de usar o session.lock eu chamei o session.update para recolocar o objeto dentro da sessao seguindo a dica de um cara do forum do hibernate. Achei meio bizarra essa solucao, ele da um update na tabela ,so que nao acontece nada pois nada mudou, so para recolocar o objeto. Me parece que o lock e o mais correto de usar, se alguem souber de a ideia ae.

Alberto

smorigo

Olha no meu caso funciono perfeitamente!!! valeu pela ajuda!!!

A

Vc usou o session.lock? ou deu um update?

Alberto

smorigo

Usei o session.lock antes de tentar recuperar meu Set.

Mauricio_Linhares

Já tentou dar um refresh no objeto?

Criado 26 de março de 2006
Ultima resposta 5 de abr. de 2006
Respostas 7
Participantes 3