IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

problème de lazy load


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut problème de lazy load
    Bonjour j'ai un soucis de récupération d'une entity en relation avec un entity obtenu.

    En fait en récupérant une liste d'entity A, j'essaie de récupérer les informations nécessaires, que je transmet vers une autre application, dans un Value Object. Or mon entity A est composé d'un lien vers un entity B (relation bidirectionnelle), et quand je tente de transférer mon entity B dans un ValueObject, en mode débug je m'aperçois que ses champs sont null, alors que l'evaluation du getEntityB est correct.

    En fait ce problème ne soulève aucune erreur et arrive aléatoirement et sur différents entity... Sinon au départ ma relation est définie en fetch = FetchType.LAZY. Mais quand je la passe en EAGER je n'ai plus le problème, sauf que je ne peut pas me permettre de placer cela dans un contexte EAGER.

    De plus en vérifiant en mod debug j'ai avec la commande d'affichage le détail correct, mais quand je regarde le détail de la variable tout est à null...

    Quelqu'un saurait d'où vient le problème ? Je soupçonne un problème de proxy, ai-je raison ?


    Pour préciser rapidement le contexte, je suis en JPA manager par spring, donc entity, dao avec entityManager, et transactions managées par Spring 2.5 dans mes services.

    N'hésitez pas à me demander un extrait de code précis. Je n'ai pas mis de code volontairement car le tout est assez compliqué en opérations.

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Bon j'ai la quasi certitude que l'objet n'est pas récupéré et qu'il s'agit d'un problème de proxy, sauriez vous comment je pourrais faire pour récupérer l'objet du proxy ?

    Voici le détail de l'objet dans le débugger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    "entity\r\n"= AStructure$$EnhancerByCGLIB$$dee9a340  (id=31)	
    	abonnement= null	
    	adresse= null	
    	categorie= null	
    	centresInterets= null	
    	CGLIB$BOUND= true	
    	CGLIB$CALLBACK_0= CGLIBLazyInitializer  (id=47)	
    	CGLIB$CALLBACK_1= null	
    	CGLIB$CONSTRUCTED= true	
    	cleJointure= null	
    	contact= null	
    	etat= null	
    	id= 0	
    	incertains= null	
    	mail= null	
    	nom= null	
    	personnesRattachement= null	
    	profils= null	
    	responsable= null	
    	siren= null	
    	siteWeb= null	
    	telephones= null	
    	type= null	
    	version= 0

  3. #3
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Donc voici l'erreur que j'obtiens finalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Exception in thread "main" java.lang.ClassCastException: org.esco.sarapis.db.entity.structure.AStructure$$EnhancerByCGLIB$$e56c2d95
    	at org.esco.sarapis.db.domain.EntityToVO.astructureToVO(EntityToVO.java:323)
    	at org.esco.sarapis.db.domain.EntityToVO.apersonneToVO(EntityToVO.java:176)
    	at org.esco.sarapis.db.domain.EntityToVO.enseignantToVO(EntityToVO.java:477)
    	at org.esco.sarapis.db.domain.EntityToVO.apersonneToVO(EntityToVO.java:305)
    	at org.esco.sarapis.db.mock.TestVoMock.testAPersVO(TestVoMock.java:70)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    	at $Proxy67.testAPersVO(Unknown Source)
    	at org.esco.sarapis.db.mock.TestVoMock.main(TestVoMock.java:89)
    En regardant hibernate il faudrait que je créé une requête spécifique avec des join pour les éléments qui m'interessent ... Est ce une bonne solution ? ou y aurait il mieux ?

    J'aimerai que quand je fais appel à la méthode get d'un entity il me charge à la demande l'objet ou la collection d'objet, cela est il possible ? et comment ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 383
    Points : 468
    Points
    468
    Par défaut
    C'est surtout ta classe qui contient les annotations de mapping qu'il faudrait poster ici.
    Mets aussi le code où tu tentes ce casting.

    En principe en mode lazy, tant que tu fais pas un entityA.getEntityB(), l'entityB est remplacé par un proxy. Au moment du getEntityB(), Hibernate effectue la requête et récupère l'entité réelle.

  5. #5
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    En fait j'ai en quelque sorte résolu le pb, la chose que j'essayais de faire était de récupérer des entity de les copier dans un objet temporaire avec uniquement des informations nécessaires. Et pour cela j'ai défini une méthode specifique EntityToVO pour chacun de mes objets. Sauf que quand j'essayais de récupérer les infos de l'entityB obtenu à partir de EntityToVO( EntityA.getEntityB() ) j'avais des erreurs. Cela fonctionne si je ne fais pas appel à la méthode et si j'initialise l'objet en direct dans la méthode de traitement de l'entityA.

Discussions similaires

  1. Problème avec le lazy loading
    Par Arsenic68 dans le forum Entity Framework
    Réponses: 0
    Dernier message: 07/07/2010, 15h51
  2. Problème de Lazy Loading
    Par menzlitsh dans le forum JPA
    Réponses: 1
    Dernier message: 11/02/2009, 15h37
  3. [JTree] Problème de lazy load
    Par heid dans le forum Composants
    Réponses: 4
    Dernier message: 07/09/2007, 11h15
  4. Problème de lazy load
    Par breezer911 dans le forum Hibernate
    Réponses: 1
    Dernier message: 13/08/2007, 15h11
  5. [hibernate] problème pour desactiver le lazy loading
    Par agougeon dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/03/2006, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo