Fetch Lazy não funciona no JPA com EclipseLink - RESOLVIDO

4 respostas
lucasbibiano

Prezados, boa tarde.
Nossa estou pesquisando bastante a respeito, mas ainda não tive nenhuma resposta que realmente funcionasse.
Estou mapeando as tabelas de um banco com JPA utilizando o EclipseLink como provider.
Em alguns casos a hierarquia dos relacionamentos é grande, e para melhorar o desempenho decidimos utilizar o Fetch Type Lazy em alguns relacionamento many-to-one.

O ambiente que estamos executando é o seguinte:
JBoss 4.2.1
Oracle

Utilizando uma aplicação J2EE, organizada da seguinte forma:
= Projeto Ear contendo:

  • Projeto EJB (Localizado o mapeamento JPA)
  • Projeto Web
    Achei uma referência no Wiki do Eclipse Link (http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG))
    If you are developing your application in a Java EE environment, you only have to set fetch to javax.persistence.FetchType.LAZY, and EclipseLink persistence provider will supply all the necessary functionality.

Então realizei o mapamento, como do exemplo a seguir:

@ManyToOne(fetch=FetchType.LAZY)

Entretanto o Lazy não esta funcionando, pois no debug ele executa todos os selects dos relacionamentos.

Alguém tem alguma dica de algo que esteja fazendo errado?

Muito Obrigado.

4 Respostas

G

Quando você faz um debug você “toca” no objeto, assim o lazy precisa carregar os objetos. Ou seja, funcionar funciona, porém se você for ler o objeto pelo debugger você está carregando-o, dando a impressão que o lazy não funciona.

Eu uso o eclipselink em dois projetos meus, e não tenho problemas quando a lazy com ele. Faça os testes apenas lendo os comandos SQL executados no console, mas sem usar ferramenta de debug para ver se é ou não executado o select.

lucasbibiano

Desculpe-me, expressei-me mal.
Na verdade eu vejo todas as consultas sendo executada pelo console mesmo, não chego a “tocar” no objeto.

Muito Obrigado.

G

Lucas, deveria funcionar com lazy. Pelo que você falou o mapeamento está correto. Será que então não tem algum código em outro lado que está fazendo algum System.out.println() ou algo assim, fazendo carregar os lazy-load?

lucasbibiano

Garcia, obrigado pelas dicas… Ontem finalmente consegui resolver o problema.

Faltava fazer o weave das entidades, consegui fazer com o script ant a seguir (é necessário definir as variáveis utilizadas):

<target name="run-weaver">
		<taskdef name="weave" classname="org.eclipse.persistence.tools.weaving.jpa.StaticWeaveAntTask">
			<classpath>
				<pathelement path="${libs}/persistence.jar" />
				<pathelement path="${libs}/eclipselink.jar" />
			</classpath>
		</taskdef>

		<!-- process the weaving function, persistenceInfo references persistence.xml -->
		<weave source="${ejb.build}" target="${ejb.build.wove}" loglevel="FINEST">
			<classpath>
				<pathelement path="${path}/DtpInfraCore.jar" />
			</classpath>
		</weave>
</target>

Um detalhe importante que me tomou muito tempo. Aqui na empresa usamos o EclipseLink 1.1.1.
Essa versão do EclipseLink não reconhece as entidades mapeadas por anotações na hora de fazer o weave.
Ou mapeava as classes no orm.xml ou atualizava o EclipseLink.
Foi o que fiz, atualizei para a versão 2.0 e consegui fazer o weave, mas para a execução ainda estou utilizando a versão 1.1.1 e esta funcionando corretamente.

Valeu!!!

Criado 29 de dezembro de 2009
Ultima resposta 5 de jan. de 2010
Respostas 4
Participantes 2