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 :

Migration NHbernate 1.2 vers 3.2


Sujet :

NHibernate

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Migration NHbernate 1.2 vers 3.2
    Bonjour,

    Je suis en train d'effectuer une migration d'un projet sous NHibernate 1.2 vers la version 3.2 et j'ai un problème au niveau du chargement d'une collection.

    En gros j'ai une classe "Carton" et une classe "Boite", un carton peut contenir plusieur boites. Dans ma classe Carton j'ai une propriété "Inventaire" en virtual qui permet d'accéder à ces cartons.

    Au lancement de mon appli tout va bien, ma requête va bien récupérer mon carton, mais la propriété reste vide. Il me semble que lazy loading par défaut est activé, j'ai essayé de mettre ce lazy à false un peu partout mais rien n'y fait, je vois bien que le chargement met plus de temps mais rien n'est récupéré.

    J'ai bien évidemment fait le mapping puisque cela fonctionnnait très bien en version 1.2.

    Voici mon app.config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
        <session-factory>
                <property name="dialect">NHibernate.Dialect.FirebirdDialect</property>
          <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
          <property name="connection.driver_class">NHibernate.Driver.FirebirdClientDriver</property>
          <property name="connection.connection_string">server=dev;User=toto;Password=tata;Database=titi;Charset=ISO8859_1;</property>
          <property name="show_sql">true</property>
          <property name="query.substitutions">true 1, false 0</property>
          <mapping assembly="CACAO_Framework"/>
        </session-factory>
      </hibernate-configuration>
    La requête qui récupère mon carton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static Carton GetCartonById(long id)
            {
                IQuery srv = GetCurrentSession().CreateQuery("from Carton c where c.Id  = :id");
                srv.SetParameter("id", id);
                Carton result = srv.UniqueResult<Carton>();
                return result;
            }
    Est-ce une histoire de lazy loading ?
    Ou comment dans ma requête puis je faire un "Load" comme en Linq ?
    Des idées ?

    Merci d'avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    Bonjour,
    par un "Load", tu veux dire une commande comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var session = GetCurrentSession();
    return session.Load<Carton>(id);
    Les méthodes Load & Get sont déjà existantes dans la session.

    Attention : Get te renverra null si il ne trouve pas l'id et Load te renverra un proxy qui lancera une exception si l'objet n'existe pas quand tu voudra y accéder.

    Pour forcer le fetching de la collection, tu peux la désactiver dans le mapping (lazy="false") forcer à faire un jointure ("fetch=join")

    d'autres méthodes existent également pour le hql, le requetage par criteria & QueryOver

    Pour le hql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from Carton c where c.Id  = :id left join fetch c.Inventaire
    Pour l'api criteria - setFetchMode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var result = GetCurrentSession()
                    .CreateCriteria<Carton>()
                    .SetFetchMode("Inventaire", FetchMode.Eager)
                    .Add(Restrictions.Where<PDCInfo>(carton => carton.Id == id))
                    .SetResultTransformer(Transformers.DistinctRootEntity)
                    .UniqueResult<Carton>();
    et enfin pour la queryOver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var result = GetCurrentSession()
                    .QueryOver<Carton>()
                    .Where(carton => carton.Id == id)
                    .Fetch(carton => carton.Inventaire).Eager
                    .TransformUsing(Transformers.DistinctRootEntity)
                    .SingleOrDefault();
    Si tu as systématiquement besoin de l'information inventaire, autant la mapper en eager / join dans le mapping.
    Sinon, faire une requete, la plus simple possible et spécifier le résultat.

    Attention, avec les requêtes à jointure, tu peux te retrouver avec des résultats en double. La raison de la ligne du "Transformers.DistinctRootEntity" c'est pour filtrer par entité racine. il te faudra aussi la spécifier sur l'objet IQuery si tu utilises le hql.

    J'ai un peu de mal également à comprendre pourquoi tu met le hql directement dans le code ? perso, je préfère le sortir dans le mapping de manière a n'avoir qu'une grosse partie qui concerne la base de données.

    Bref, dans tous les cas, tu as de quoi avancer !

    Bonne après midi.

Discussions similaires

  1. Réponses: 26
    Dernier message: 12/11/2008, 17h59
  2. migration de base access vers postgres
    Par greg_ggl dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 09/03/2006, 10h33
  3. [PostGre] Migration de Oracle 8i vers PostGre ?
    Par delphim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 21/04/2004, 17h04
  4. [Migrat+doc] de Netbeans vers Eclipse d'une applic existante
    Par vempiria dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/04/2004, 08h23
  5. Migration 7.3.4 vers 9.2
    Par childeric dans le forum Administration
    Réponses: 8
    Dernier message: 12/03/2004, 09h45

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