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

Hibernate Java Discussion :

oneToOne en lazy


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 90
    Par défaut oneToOne en lazy
    Bonjour
    J'ai un problème avec les relations oneToOne, et leurs chargements explicites.
    je m'explique :
    j'ai un Objet A mappé sur une table tA et un objet B mappé sur une table Tb avec une relation 1-1 entre les 2 (utilisation de pk)

    Mon objectif est de charger l'objet A (via hql)
    Dans certain cas je veux uniquement l'objet A et dans d'autre je veux A et l'objet B associé

    dans mon mapping j'ai d'abord utilisé sur mon objet A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @OneToOne(mappedBy = "a", fetch = FetchType.LAZY)
    B b;

    Et je lance un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query q1 = getSession().createSQLQuery(from A where key=XX);
    q1.uniqueResult();
    et là surprise je vois 2 requêtes partir :
    une pour récupéré l'objet A
    et une autre pour récupéré l'objet B associé à A
    et niveau performance je ne veux pas récupérer une objet dont je n'ai pas besoin.

    par contre si je lance un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query q1 = getSession().createSQLQuery(from A as a left outer join fetch a.b where key=XX);
    q1.uniqueResult();
    là une seul requête part, et je peux sans problème dans mon code faire un a.getB() sans avoir à nouveau a requeter.


    nous avons ensuite trouver la solution de modifier le mapping en rajoutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @OneToOne(mappedBy = "a", fetch = FetchType.LAZY)
     @LazyToOne(LazyToOneOption.NO_PROXY)
    B b;
    et en instrumentant le code avec org.hibernate.tool.instrument.javassist.InstrumentTask

    là le comportement est différent :
    si on désire uniquement récupé A et qu'on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query q1 = getSession().createSQLQuery(from A where key=XX);
    q1.uniqueResult();
    Là une seul réquete part (c'est ce qu'on veut)

    par contre si on veut A et A.b et qu'on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Query q1 = getSession().createSQLQuery(from A as a left outer join fetch a.b where key=XX);
    q1.uniqueResult();
    a.getB();
    une seul requete part lors du uniqueResult(). (et on voit bien dans le from qu'il requête les tables tA et tB)
    MAIS dès qu'on fait le a.getB()
    il lance un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from tB where key =....
    et là c'est pas bon du tout

    N'y a t'il pas moyen d'avoir une relation oneToOne et de pouvoir requeter exactement ce qu'on veux en HQL et que aucune requete se fasse dans notre dos si on accède à une objet requeter au debut ?

    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 90
    Par défaut
    après investigation je me suis rendu compte que le problème vient des relations 1-0

    Lors que l'objet A a un b tout marche bien (1 seul requête)
    mais lorsque que il n'y a pas de b pour un A alors 2 requêtes partent (genre pour vérifier qu'il a bien un null en face..)

    maintenant du coup comment mapper une relation 1to0..1 ??

Discussions similaires

  1. OneToOne et Lazy loading
    Par plsavary dans le forum Hibernate
    Réponses: 4
    Dernier message: 30/04/2011, 10h51
  2. manyToMany + oneToOne + performance+LAZY
    Par jmturc dans le forum JPA
    Réponses: 2
    Dernier message: 28/04/2010, 19h33
  3. Réponses: 6
    Dernier message: 10/07/2006, 11h55
  4. [hibernate] problème pour desactiver le lazy loading
    Par agougeon dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/03/2006, 11h20
  5. [HIBERNATE 3]Lazy loading
    Par SEMPERE Benjamin dans le forum Hibernate
    Réponses: 11
    Dernier message: 08/02/2006, 22h40

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