JPA FetchType! Erro?

3 respostas
B

Ola, estou usando no mapeamento das minhas entidades, onde aparece os relacionamentos, o “fetch=FetchType.Lazy”…

Vamos supor q eu tenho 3 entidades, Aluno, Curso, Escola.
O relacionamento entao fica ± assim:

A entidade Aluno:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="curso_id", referencedColumnName="curso_id", insertable = false, updatable = false)
Curso curso;
public Curso getCurso() { return curso; }

E a entidade Curso:

@OneToMany(mappedBy="curso",fetch=FetchType.LAZY)
List<Aluno> alunos;
public List<Aluno> getAlunos() { return alunos; }

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="escola_id", referencedColumnName="escola_id", insertable = false, updatable = false)
Escola escola;
public Escola getEscola() { return escola; }

A entidade escola:

@OneToMany(mappedBy="escola",fetch=FetchType.LAZY)
List<Curso> cursos;
public List<Curso> getCursos() { return cursos; }

Configurei para aparecer o query que o JPA executa.

Ao pegar um curso, usando o entityManager.find(), ele executa uma query, nao executando a query para pegar todos seus alunos.
Ao usar a funcao getAlunos() deste curso, o JPA executa outro query q pega os alunos do curso e executa uma segunda query q pega a escola do curso! Eu declarei o fetch como lazy, n era pra ele pegar a escola do curso, apenas quando eu chamar o metodo getEscola()! Como faço entao? Eu nao queria q essa segunda query seja executada antes de eu chamar o metodo para pegar a escola :confused:

O engraçado eh q todos os relacionamentos ManyToOne fazem isso, ignoram o fetch como lazy!

Alguem teve esse problema tbm?
Vlw!

3 Respostas

B

Descobri q vc tem q colocar no persistence.xml isso:

<property name="toplink.weaving" value = "static"/>

Mas dai olha os erros q dao quando eu executo o programa:

Exception [TOPLINK-60] (Oracle TopLink Essentials - 2.0
(Build b41-beta2 (03/30/2007))): 
oracle.toplink.essentials.exceptions.DescriptorException 
Exception Description: The method [_toplink_setcurso_vh] 
or [_toplink_getcurso_vh] is not defined in the object 
[entity.Aluno].
Internal Exception: java.lang.NoSuchMethodException: 
entity.Aluno._toplink_getcurso_vh()
Mapping: 
oracle.toplink.essentials.mappings.OneToOneMapping[curso]

Da varios destas excessoes, e estas tbm:

java.lang.NullPointerException
	at oracle.toplink.essentials.internal.security.PrivilegedAccessHelper.
getMethodReturnType(PrivilegedAccessHelper.java:271)
	at oracle.toplink.essentials.internal.descriptors.MethodAttributeAccessor.
getGetMethodReturnType(MethodAttributeAccessor.java:113)
	at oracle.toplink.essentials.mappings.ForeignReferenceMapping. 
validateBeforeInitialization(ForeignReferenceMapping.java:873)
	at oracle.toplink.essentials.descriptors.ClassDescriptor.
validateBeforeInitialization(ClassDescriptor.java:3505)
	at oracle.toplink.essentials.descriptors.ClassDescriptor.
preInitialize(ClassDescriptor.java:2198)
	at oracle.toplink.essentials.internal.sessions.
DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:380)
	at oracle.toplink.essentials.internal.sessions.
DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:360)
	at oracle.toplink.essentials.internal.sessions.
DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:677)
	at oracle.toplink.essentials.internal.sessions.
DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:559)
	at oracle.toplink.essentials.ejb.cmp3.
EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:206)
	at oracle.toplink.essentials.internal.ejb.cmp3.
EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:212)
	at oracle.toplink.essentials.internal.ejb.cmp3.base.
EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:78)
	at oracle.toplink.essentials.internal.ejb.cmp3.base.
EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:111)
	at oracle.toplink.essentials.internal.ejb.cmp3.base.
EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:105)
	at oracle.toplink.essentials.internal.ejb.cmp3.
EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:76)
	at test.Main.main(Main.java:23)

Alguem sabe o q ta de errado? :confused:
Flw!

B

Depois de muito apanhar, ler 1000 paginas de manuais, achei:

http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/toplink-jpa-extensions.html#DynamicWeaving

Pra quem precisar ta ai!
Flw!

orogerio

brunoja:
Depois de muito apanhar, ler 1000 paginas de manuais, achei:

http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/toplink-jpa-extensions.html#DynamicWeaving

Pra quem precisar ta ai!
Flw!

Qdo eu coloco no persistence está dando erro ainda :frowning:
Oq vc fez para funcionar o Lazy no toplink?

Criado 23 de janeiro de 2008
Ultima resposta 20 de abr. de 2009
Respostas 3
Participantes 2