Ola,
Estou com um problema onde mesmo ao setar @ManyToOne(fetch=FetchType.LAZY) nos mapeamentos os objeto são carregados.
Percebi que eles são carregados até 2 níveis. Ou seja, no exemplo: Cidade tem um Estado, que tem um Pais, que tem um Continente.
Ao se carregar uma cidade, todos seus dados até Pais são carregados, apenas Continente que não.
Verifiquei em algumas referências que no eclipselink o fetch lazy para ManyToOne só funcionaria com weaving, hablitei o weaving como dynamic e mesmo assim não funciona.
Alguem já sabe o que pode estar ocorrendo?
Estou utilizando:
eclipselink v2.3.2 (já testei anteriores)
JBoss v7.1.1 final
Segue meu persistence.xml:
[code]<?xml version="1.0" encoding="UTF-8"?>
<persistence-unit name="PU_Negocio" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<shared-cache-mode>NONE</shared-cache-mode>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<jta-data-source>java:/ds1</jta-data-source>
<class>Classe1</class>
...
<class>ClasseN</class>
<shared-cache-mode>NONE</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.ibm.db2.jcc.DB2Driver" />
<property name="eclipselink.target-server" value="JBoss" />
<property name="eclipselink.weaving" value="dynamic" />
<property name="eclipselink.weaving.lazy" value="true"/>
<property name="eclipselink.cache.shared.default" value="false" />
<property name="eclipselink.cache.size.default" value="0" />
<property name="eclipselink.cache.type.default" value="none" />
<property name="eclipselink.target-database" value="DB2" />
<property name="eclipselink.logging.level.sql" value="ALL"/>
<property name="jboss.as.jpa.providerModule" value="org.eclipse.persistence.jpa"/>
</properties>
</persistence-unit>
<persistence-unit name="PU_Seguranca" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jar-file>../lib/security.jar</jar-file>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>NONE</shared-cache-mode>
<jta-data-source>java:/ds2</jta-data-source>
<class>ClasseS1</class>
...
<class>ClasseSN</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.ibm.db2.jcc.DB2Driver" />
<property name="eclipselink.target-server" value="JBoss" />
<property name="eclipselink.weaving" value="dynamic" />
<property name="eclipselink.weaving.lazy" value="true"/>
<property name="eclipselink.cache.shared.default" value="false" />
<property name="eclipselink.cache.size.default" value="0" />
<property name="eclipselink.cache.type.default" value="none" />
<property name="eclipselink.target-database" value="DB2"/>
<property name="eclipselink.logging.level.sql" value="ALL"/>
<property name="jboss.as.jpa.providerModule" value="org.eclipse.persistence.jpa"/>
</properties>
</persistence-unit>
[/code]
Não, nenhum erro, a aplicação funciona normalmente.
O problema é performance.
Como assim performance ?
Está demorando mt a consulta ?
Creio que se você for lá no forum deles eles poderão te ajudar mais.
Uma coisa é certo, o EAGER e LAZY são hints, mas uma implementação não é obrigada a seguir. =/
Nesse post tem um pouco sobre esse assunto e aponta 4 links que talvez possam te ajudar.
http://uaihebert.com/?p=1367&page=8
Sim, performance.
Entenda, nem sempre precisarei utilizar todo o mapeamento de um objeto.
As vezes preciso saber apenas o nome de uma cidade, então num simples find por id o eclipselink faz subqueries pra trazer todos os dados de seu Estado, Pais, etc. em cascata.
A consulta em específico é irrisória a lentidão, pois é apenas um exemplo que citei, mas isso se aplica pra todas consultas na aplicação toda.
De modo escalar a aplicação com muitas pessoas utilizando tende a ficar lenta.
Eu uma consulta acho que você pode sobrescrever as propriedades de lazy, cascade se não me engano.
Mostra como você modelou essas entidades
[quote=lele_vader]Eu uma consulta acho que você pode sobrescrever as propriedades de lazy, cascade se não me engano.
Mostra como você modelou essas entidades
[/quote]Mano, o problema dele é que a entidade está como LAZY, mas mesmo assim vem EAGER. Sacou?[quote]Estou com um problema onde mesmo ao setar @ManyToOne(fetch=FetchType.LAZY) nos mapeamentos os objeto são carregados. [/quote]
Ola jakefrog,
Obrigado pelos links, mas não achei nada que pudesse solucionar meu problema.
A documentação do eclipselink diz que funciona o fetch lazy no ManyToOne com o weaving em modo J2EE.
Estava suspeitando que pudesse ser algo da implementação do eclipselink com o JBoss 7.
O problema atual é que a aplicação fica em modo EAGER pra esse tipo de relacionamento ManyToOne, apenas as listas OneToMany ficam em lazy.
Já estou analisando formas de contornar o problema, que seriam criar Entidades com apenas tipos primitivos e Wrappers, para retorno de consultas.
[quote=robinsonbonilha]Ola jakefrog,
Obrigado pelos links, mas não achei nada que pudesse solucionar meu problema.
A documentação do eclipselink diz que funciona o fetch lazy no ManyToOne com o weaving em modo J2EE.
Estava suspeitando que pudesse ser algo da implementação do eclipselink com o JBoss 7.
O problema atual é que a aplicação fica em modo EAGER pra esse tipo de relacionamento ManyToOne, apenas as listas OneToMany ficam em lazy.
Já estou analisando formas de contornar o problema, que seriam criar Entidades com apenas tipos primitivos e Wrappers, para retorno de consultas.
[/quote]Saquei. Será que você migrar para hibernate não seria mais fácil? Será que esse bug não está relatado no forum do JBoss?
Então jakefrog,
Pensei em colocar o Hibernate, mas uma das preferência pelo eclipselink era que ele recupera a conexão, no modo sob demanda, sem precisar fazer o famoso Hibernate.initialize
Fora que já há um legado de aplicações em eclipselink aqui e deixar arquitetura heterogenea não seria bem vindo.
Vou esperar mais um pouco pra ver se alguem já resolveu isso com menor impacto.
[quote=robinsonbonilha]Então jakefrog,
Pensei em colocar o Hibernate, mas uma das preferência pelo eclipselink era que ele recupera a conexão, no modo sob demanda, sem precisar fazer o famoso Hibernate.initialize
Fora que já há um legado de aplicações em eclipselink aqui e deixar arquitetura heterogenea não seria bem vindo.
Vou esperar mais um pouco pra ver se alguem já resolveu isso com menor impacto.[/quote]Saquei.
Mas o JBoss já não faz isso? Quando você configura a aplicação pelo datasource?
Que eu saiba não. Os datasources dos Applications Servers controlam a conexão com o banco.
Mas digo que o Hibernate, perde ou perdia (não conferi as ultimas versões), com o proxy session.
Quando sua tela dava um get em um atributo lazy não inicializado ele subia Exception, no eclipse link mesmo quando você não faz a previsão dos fetch joins durante a query ele busca tardiamente.
[quote=robinsonbonilha]Que eu saiba não. Os datasources dos Applications Servers controlam a conexão com o banco.
Mas digo que o Hibernate, perde ou perdia (não conferi as ultimas versões), com o proxy session.
Quando sua tela dava um get em um atributo lazy não inicializado ele subia Exception, no eclipse link mesmo quando você não faz a previsão dos fetch joins durante a query ele busca tardiamente.[/quote]Saquei.
Bem boa sorte ae e desculpe não poder ajudar.
Se consegui achar uma resposta prática para o assunto, poste aí. [=
Obrigado vocês pelo apoio jakefrog e lele_vader,
Não precisa se desculpar, estou batendo a cabeça há algumas semanas com o outro arquiteto aqui, pra ver se resolvemos isso sem mudar a tecnologia.
Em duas telas mais pesadas, que há listas grandes, já contornamos utilizando as Classes com tipos Wrappers. Mas não é o caminho ideal.
Se descobrir algo, com certeza postarei a solução.