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 :

Probleme mapping bidirectionnel


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Probleme mapping bidirectionnel
    Bonjour,

    je ne maitrise pas tout à fait hibernate et sur le projet sur lequel je travaille, nous avons de gros problèmes de performance, en regardant de plus près, je me suis aperçu que nous faisons des relations bidirectionnelles à savoir :

    J'ai un objet 1 qui référence un second de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		<set name="listobj2" table="OBJ2" cascade="save-update">
    			<key column="ID_OBJ2"/>
    			<one-to-many class="com.class.obj2" />
    		</set>
    et l'objet 2 référence l'objet 1 de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		<many-to-one name="obj1" class="com.class.obj1">
    			<column name="ID_OBJ1" />
    		</many-to-one>
    donc en gros le premier objet contient un set du second. Et chaque objet du second contient son objet mère. Lorsque je regarde mon objet récupéré, l'arbre est énorme car l'objet mère va chercher sa liste d'objet fils, chaque objet fils va chercher son objet mère, et chaque objet mère va chercher ses fils etc..... ca fait une sorte de boucle infinie si vous voyez ce que veux dire. J'ai entendu parler de inverse, est ce que cela serait une solution à mon problème, et comment l'utiliser?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    il n'y a pas de boucle infinie en hibernate, puisqu'un "row" ne peux pas être présent deux fois dans une même session. Pour éviter que toute la base de donnée ne se charge, ce que tu dois utiliser c'est le lazy:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            <set name="listobj2" table="OBJ2" cascade="save-update" lazy="true">
                <key column="ID_OBJ2"/>
                <one-to-many class="com.class.obj2" />
            </set>
    Ce qui permettra de ne charger le set que si on tente d'y accéder.

    Le inverse a un autre usage, il sert à déterminer quelle partie de la relation bi-directionelle est chargée de la mise à jour. C'est important pour éviter que hibernate ne s'embrouille les pédales lors de la sauvegarde.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    j'ai déjà testé en mettant le lazy à true mais cela me charge toujours toutes mes données, je ne sais pas si ca a un rapport mais voici un bout du code du get :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (tmpObj instanceof HibernateProxy) {
                    result = ((HibernateProxy) tmpObj)
                            .getHibernateLazyInitializer().getImplementation();
                }
    Je ne sais pas à quoi sert le getHibernateLazyInitializer...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    ces objet n'ont pas à connaitre hibernate, tu les code normalement, t'as pas besoin d'aller tripoter les Lazyinitializers et les proxy.

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Ton morceau de code demande explicitement d'aller cherche les objets reliés en mode lazy à ton entité. Pour peu que tu le fasses de façon récursive, ça revient à enlever le mode lazy, et donc bonjour le téléchargement de la base ^^

Discussions similaires

  1. mapping bidirectionnel + colonne
    Par Eldokoeur dans le forum Hibernate
    Réponses: 2
    Dernier message: 25/06/2008, 08h44
  2. Probleme map iterator
    Par Veovis dans le forum SL & STL
    Réponses: 2
    Dernier message: 02/06/2008, 22h08
  3. problem mapping Resources
    Par ahury dans le forum Spring
    Réponses: 1
    Dernier message: 30/09/2007, 21h48
  4. Tomcat hibernate annotation DAO probleme mapping
    Par bibi73 dans le forum Hibernate
    Réponses: 20
    Dernier message: 20/08/2007, 14h40
  5. [hibernate] Probleme mapping -> clé composée
    Par zorm dans le forum Hibernate
    Réponses: 3
    Dernier message: 04/07/2007, 12h57

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