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

NHibernate Discussion :

NHibernate et lazy loading


Sujet :

NHibernate

  1. #1
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut NHibernate et lazy loading
    Bonjour,

    je débute avec NHibernate et je me trouve confronté au Lazy Loading.

    Commencons pas le commencement et précisons la structure de la base de données.

    Une table MON_SERVICE : SVC_ID, SVC_LBL, SVC_REF
    Une table MON_HOST : HST_ID, HST_LBL, HST_PATH
    Une table MON_HSR : HSR_SVC_ID, HSR_HST_ID, HSR_FCT

    Mon application est assez simple :
    - Une page listant les services
    - Une page de détail lisant les services et ses host associés (+ le champ HSR_FCT)


    J'ai donc déclarer des classes c# pour chacune des tables et j'y ai associé les fichiers NHibernate hbm.xml.

    J'ai commencé par ne pas inclure les liens avec les autres tables dans le fichier Service.hbm.xml

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="WebGram.DTO" assembly="WebGram.DTO">
       <class name="MonServiceDTO" table="MON_SERVICE">
          <id name="Id" column="svc_id">
             <generator class="sequence">
                <param name="sequence">SEQ_MON_SERVICE_ID</param>
             </generator>
          </id>
          <property name="Label" column="SVC_LBL"/>
          <property name="Ref" column="SVC_REF" />
       </class>
    </hibernate-mapping>

    J'affichais donc très bien ma liste de service ainsi que le détail simple (sans le HSR et le HOST)

    J'ai donc ensuite ajouté le lien vers le HSR dans mon fichier
    Code xml : 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
     
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="WebGram.DTO" assembly="WebGram.DTO">
       <class name="MonServiceDTO" table="MON_SERVICE">
          <id name="Id" column="svc_id">
             <generator class="sequence">
                <param name="sequence">SEQ_MON_SERVICE_ID</param>
             </generator>
          </id>
          <property name="Label" column="SVC_LBL"/>
          <property name="Ref" column="SVC_REF" />
          <bag name="listeHsr">
             <key column="hsr_svc_id"/>
             <one-to-many
                class="MonHsrDTO"/>
          </bag>
     
       </class>
    </hibernate-mapping>

    Seulement uen fois sorti de ma session NHibernate (développement n-tiers), je n'avais plus accès à mon objet listeHsr (NB : j'y ai accès dans ma session NHibernate)
    Cela vient du principe de lazy loading.
    J'ai donc voulu supprimer le lazy loading directement dans mon fichier hbm.xml en modifiant ma balise
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <bag name="listeHsr">
    en
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <bag name="listeHsr" lazy="false">
    J'ai bien mes infos sur le détail mais de temps d'affichage de ma liste en patit grandement.

    Pour le moment j'ai donc créer une classe pour l'affichage de la liste et une pour l'affichage du détail (avec les fichiers hbm.xml associés) mais cela ne me convient pas vraiment.

    Y-a-t-il un moyen dans la session NHibernate de dire, maintenant tu gardes les infos même en dehors de la session ?

    Merci de votre aide
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 202
    Points
    2 202
    Par défaut
    Non c'est un contre emploi.

    Le lazy loading est conçu pour être utilisé au sein d'un unit of work, en l'occurence la session, et permet par l'intermédiaire d'un proxy de délayer le chargement d'un élément.

    Dans le cas de web services ou de toute application distribuée, tu ne peux pas sur le client atteindre ta session (aspects stateless / statefull)

    Donc dans le cas d'une architecture multi tiers, si tu souhaites transférer des objets persistents sur le domaine, il faut t'assurer que tu contrôles le graph objet et qu'il soit exhaustif de ton traitement; soit utiliser des principes de DTO / Value objects qui te permettent d'envoyer une "vue métier" des données depuis les entités.


    Il n'y a pas de moyen d'avoir la gestion d'état en dehors de la session, puisque c'est son propos et ce qui permet d'utiliser des poco.

    Après il existe des possibilités d'architecture différentes, mais pour faire des webs services, il vaut mieux s'habituer à travailler sans état.

  3. #3
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    OK Merci
    je vais à ce moment voir pour passer par des DTO qui seront initialisés dans me session NHibernate.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 202
    Points
    2 202
    Par défaut
    De toutes les façons, tu peux considérer qu'à partir du moment où tu te demandes comment manipuler les proxys sur une application sans état, tu es dans un problème de modélisation.

    En effet, pour travailler normalement il faut que tes graphs soient pleins et sérialisables sans risque. Donc cela exclu l'utilisation du lazy loading.

    En revanche, tu peux très bien côté client créer ta propre API de manipulation de services et utiliser de la composition pour alléger les traitements, mais là ce n'est plus du ressort de nhibernate mais du ressort de tes services et de ton architecture.

    Si tu as besoin de faire du map objet-objet, ce petit nouveau est très bien:value injecter

    Good Luck

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme Lazy Loading avec Nhibernate
    Par riric85 dans le forum NHibernate
    Réponses: 1
    Dernier message: 25/11/2008, 11h15
  2. Lazy loading sur component
    Par El Saigneur dans le forum Hibernate
    Réponses: 2
    Dernier message: 03/11/2006, 10h30
  3. Lazy loading et fermeture de session hibernate
    Par BRAUKRIS dans le forum Hibernate
    Réponses: 3
    Dernier message: 20/07/2006, 13h08
  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