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

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.

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.

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.

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?

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!!!