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 baliseen
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part <bag name="listeHsr">
J'ai bien mes infos sur le détail mais de temps d'affichage de ma liste en patit grandement.
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part <bag name="listeHsr" lazy="false">
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
Partager