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 :

Fonctionnement Hibernate en mode Lazy


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 48
    Par défaut Fonctionnement Hibernate en mode Lazy
    Bonjour j'avais déjà posté une question sur ce forum qui est la suivante
    Bonjour je souhaiterais récupérer les données au moment de leur chargement de la BDD et non du cache.
    Voilà je m'explique : je viens de me récupérer une application (client lourd) et je suis "Très" débutant en hibernate

    j'explique mon cas de figure J'ai un Objet A qui contient une collection d'objets B1, B2, B3, ...etc.
    chaque Objet B contient une collection d'objet C1, C2, C3, ...etc.
    Les objets C sont des objets complexes (graphe d'obejt assez conséquent collections à deux niveaux ).
    Tout ca est mappé par hibernate ...
    Ce que je cherche a faire c'est au lancement de l'application d'afficher la liste des objets B1 B2 et B3, ...etc., l'utilisateur en désigne un on affiche les objets C qu'il a, puis il choisit d'ouvrir un des objets C1, C2, C3, ...etc. et c'est là que j'ai les problème si entre le moment ou je lance l'application et celui du chargement de l'objet C choisi par l'utilisateur je modifie qq chose sur la base de données directement cette modification n'est pas chargée ... et il charge les données qui sont (si j'ai bien compris) dans le cache.
    Comment puis je faire pour pallier à ce problème
    Merci d'avance
    Il faut dire que je n'arrive pas cerner le fonctionnement d'hibernate la dessus. Alors mes objets finaux (de type C) que je veux charger ont un graphe d'objets assez conséquent et tous ces objets sont mis en mode Fetch = LAZY
    Donc si j'ai bien compris ils ne seront récupérés depuis la BDD que si on y accède. Voici le test que je fais :

    1- Je lance l'application (Ici je fais un currentSession.Load(A.class, id) ;

    2- L'application me propose une liste des objets B attaché à A, j'en choisis 1

    3- L'application me propose une liste des objets C attaché au B que j'ai choisi

    A CE MOMENT LA ET AVANT DE CHARGER L'OBJET C, avec MySQL Query je fais une modif sur l'un des objets qui se trouvent dans la grappe de l'objet C que je vais choisir dans la base

    4- Je choisi un Objet C et là le chargement de l'objet C se fait (je fais un Lock aussi currentSession.beginTransaction(), et currentSession.Lock() )

    5- juste à ce moment là du chargement, Pour inspecter la validité de mon objet C je parcours presque tous ses champs pour faire plein de tests de cohérence dessus c'est cette partie là qui fait (je pense) que le chargement du graphe d'objets de l'objet C de la BDD se fait (en mode show_sql=true je vois passer les requetes SQL ) et sur MySQL ADMIN je vois le traffic sur la base de données.

    MAIS LA BIZARREMENT je ne récupère la valeur que j'ai modifié sur la base de données (en rouge) mais bien la valeur d'avant ... quelqu'un aurait il une idée sur la raison ...
    Je sais c'est trop long ... mais bon je voulais être exhaustif même si je sais que j'ai dû oublier quelques détails ...

    Merci d'avance pour votre patience (si vous être arrivé jusque là )

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 48
    Par défaut
    Re-Bonjour,
    Si ma question n'est pas claire je pourrais la reformuler ... il faudrait juste me dire ce qui n'est pas précis
    Merci d'avance

  3. #3
    BsT
    BsT est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut
    Attention c'est juste pour tester cela ne correspond pas forcément à la solution finale :
    passe l'isolation level de mysql à READ COMMITTED.

    Edit : j'ai peut etre répondu rapidement dans ton application :
    * essaye : session.refresh(objetC)
    * sinon change l'isolation level de la base de données.
    Cdt.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 48
    Par défaut
    Citation Envoyé par BsT Voir le message
    Attention c'est juste pour tester cela ne correspond pas forcément à la solution finale :
    passe l'isolation level de mysql à READ COMMITTED.

    Edit : j'ai peut etre répondu rapidement dans ton application :
    * essaye : session.refresh(objetC)
    * sinon change l'isolation level de la base de données.
    Cdt.
    Bonjour, merci pour votre réponse sauf que je n'ai pas su comment positionner l'isolation level de mysql ... pourriez vous m'aider un peu plus SVP
    Merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 48
    Par défaut
    Citation Envoyé par BsT Voir le message
    * essaye : session.refresh(objetC)
    Le session.refresh marche mais il met trop de temps ... par exemple pour charger la totalité de graphe d'objet de la classe C à charger je met 10 secondes et après je fais un coup de refresh qui lui durera 10 secondes ... il recupère la totalité du graphe à nouveau ... et justement ma question était de savoir pourquoi il ne récupère pas le tout dès le départ ...
    Cdt

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 48
    Par défaut
    Citation Envoyé par BsT Voir le message
    Attention c'est juste pour tester cela ne correspond pas forcément à la solution finale :
    passe l'isolation level de mysql à READ COMMITTED.
    Je viens de trouver, j'ai rajouté ça au fichier my.ini
    transaction-isolation = READ-COMMITTED

    et maintenant .... ça marche Nickel ...
    merci beaucoup
    P.S. : Dans quelle perspective cela ne constituerait pas une solution finale ? quels sont les inconvénient d'une telle modifications ?

  7. #7
    BsT
    BsT est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut
    Read-commited, tu peux voir les modifications effectuer par d'autres utilisateurs ce qui peut être gênant dans certains algo (voir optimistic locking dans Hibernate)

    Pour afficher une liste d'objet (JTable, etc...) il convient d'effectuer une requête où tu ne sélectionnes que les données à afficher (nom, prenom pour le cas d'un objet Personne mais pas l'objet Personne) cela évite d'initialiser tout ton graphe d'objet. Le session.refresh est donc plus rapide.

    Enfin tu ne dois pas oublier qu'il y a une base de données derrière Hibernate...

Discussions similaires

  1. Impossible de faire fonctionner Hibernate
    Par cmako dans le forum Hibernate
    Réponses: 2
    Dernier message: 17/12/2007, 10h07
  2. Pourquoi le MouseMotionListener ne fonctionne pas sous mode BorderLayout?
    Par shouyanbo dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 30/03/2007, 15h45
  3. fonctionnement de l'attribut lazy
    Par Galak extra dans le forum Hibernate
    Réponses: 22
    Dernier message: 10/08/2006, 15h59
  4. Réponses: 7
    Dernier message: 15/02/2006, 12h05
  5. Applications fonctionnent uniquement en mode administrateur
    Par gil-ch dans le forum Bases de données
    Réponses: 4
    Dernier message: 01/06/2004, 13h58

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