NHibernate et lazy Fetching

thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 - 22 juil. 2008 à 12:23
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 - 22 juil. 2008 à 17:47
Bonjour,

J'utilise nhibernate avec MySql j'ai un petit souci de Late Binding.

J'ai une classe Générique Service<T> avec la méthode suivante

Dans mon cas, T est la classe Personne qui contient un lien avec la classe Adresse

public
static T GetById(
long id
){
  ISession oSession _oHibernate.GetNewSession();  TEntity oEntity oSession.Get<TEntity>(id);

  NHibernateUtil.Initialize(oEntity
);  oSession.Close();

  return oEntity;}

Normalement, la méthode NHibernate.Initialize(object o) permet de charger toutes les instances référencés par oEntity mais cela ne fonctionne pas.

L'objet oEntity(Personne) est bien chargé mais les objet liées ne le sont pas (Adresse)...

Nico

2 réponses

thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
22 juil. 2008 à 17:45
J'ai pas l'impression que ca inspire beaucoup de monde :o

J'ai trouvé une solution qui fonctionne mais je suis sure qu'Hibernate doit pouvoir gérer ca 

J'utilise cette méthode en donnant l'objet fraichement chargé par hibernate, le type de référence étant ma classe de base Entity

        /// <summary>
        /// Initialise toutes les propriétés dont le type de retour hérite de refType
        /// </summary>
        /// Type de référence

        /// Active la recherche récusive

        /// Niveau maxi

        /// Niveau en cours

        protected void Initialize(object obj, Type refType, bool recursive, int maxlevel, int currentlevel)
        {
            // Lecture de propriétés de l'objet
            Type oType = obj.GetType();
            PropertyInfo[] oProperties = oType.GetProperties(BindingFlags.Public | BindingFlags.Instance);


            // Invocation de chaque propriété dérivant de refType
            foreach(PropertyInfo oProperty in oProperties)
            {
                Type oPropertyType = oProperty.PropertyType;
                if (       // Si propriété de type table ayant pour type d'élement refType
                        (  // ou si propriété de type refType
                            (oPropertyType.HasElementType && oPropertyType.GetElementType().IsSubclassOf(refType))
                            || (oPropertyType.IsSubclassOf(refType))
                        )  // et si définit dans l'assembly en cours
                        && oProperty.DeclaringType.Assembly.Equals(Assembly.GetExecutingAssembly())
                    )
                {
                   
                    object o = oProperty.GetGetMethod().Invoke(obj, new object[0]);
                    if (recursive && currentlevel < maxlevel)
                    {
                       
                        System.Diagnostics.Debug.WriteLine
                            ("FOUND (" + currentlevel + ") " + oProperty.DeclaringType.Name + "." + oProperty.Name + " : " + oPropertyType.ToString());
                        
                        this.Initialize(o, refType, recursive, maxlevel, ++currentlevel);
                        currentlevel--;
                    }
                }
            }
        }

Voila dans l'attente d'une solution plus propre

Nico
0
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
22 juil. 2008 à 17:47
oops j'oubliais

J'utilise cette méthode à la place de NHibernateUtil.Initialize(oEntity);,
juste avant de fermer la session.

Nico
0
Rejoignez-nous