Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Futur Membre du Club
    Inscrit en
    mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 38
    Points : 18
    Points
    18

    Par défaut [NHibernate] Many-To-One génére exception

    Bonjour à tous,

    J'ai suivi, entre autre, le tuto de developpez pour me lancer sur NHibernate. Mais j'ai malheureusement un petit bug... Une exception est généré à cause d'un many-to-one

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="PamNHibernate" assembly="PamNHibernate">
    	<class name="Employe" table="EMPLOYES">
    		<id name="Id" column="ID" unsaved-value="0">
    			<generator class="native" />
    		</id>
    		<version name="Version" column="VERSION"/>
    		<property name="SS" column="SS"/>
    		<property name="Nom" column="NOM"/>
    		<property name="Prenom" column="PRENOM"/>
    		<property name="Adresse" column="ADRESSE"/>
    		<property name="Ville" column="VILLE"/>
    		<property name="CodePostal" column="CP"/>
    		<many-to-one name="Indemnites" column="INDEMNITE_ID" cascade="save-update"/>
    	</class>
    </hibernate-mapping>

    Voici la tête de l'exception


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    NHibernate.HibernateException was caught
      Message=Creating a proxy instance failed
      Source=NHibernate
      StackTrace:
           à NHibernate.Proxy.CastleProxyFactory.GetProxy(Object id, ISessionImplementor session)
           à NHibernate.Persister.Entity.AbstractEntityPersister.CreateProxy(Object id, ISessionImplementor session)
           à NHibernate.Impl.SessionImpl.DoLoadByClass(Type clazz, Object id, Boolean checkDeleted, Boolean allowProxyCreation)
           à NHibernate.Impl.SessionImpl.InternalLoad(Type clazz, Object id, Boolean eager, Boolean isNullable)
           à NHibernate.Type.EntityType.ResolveIdentifier(Object id, ISessionImplementor session)
           à NHibernate.Type.EntityType.ResolveIdentifier(Object id, ISessionImplementor session, Object owner)
           à NHibernate.Impl.SessionImpl.InitializeEntity(Object obj)
           à NHibernate.Loader.Loader.InitializeEntitiesAndCollections(IList hydratedObjects, Object resultSetId, ISessionImplementor session)
           à NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
           à NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
           à NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
           à NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
           à NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet querySpaces, IType[] resultTypes)
           à NHibernate.Hql.Classic.QueryTranslator.List(ISessionImplementor session, QueryParameters queryParameters)
           à NHibernate.Impl.SessionImpl.Find(String query, QueryParameters parameters, IList results)
           à NHibernate.Impl.SessionImpl.Find[T](String query, QueryParameters parameters)
           à NHibernate.Impl.QueryImpl.List[T]()
           à PamNHibernate.ShowDataBase.ShowDataBase1() dans c:\users\isen\documents\visual studio 2010\projects\PamNHibernate\PamNHibernate\Console\ShowDataBase.cs:ligne 50
           à PamNHibernate.ShowDataBase.Main(String[] args) dans c:\users\isen\documents\visual studio 2010\projects\PamNHibernate\PamNHibernate\Console\ShowDataBase.cs:ligne 22
      InnerException: System.Reflection.AmbiguousMatchException
           Message=Correspondance ambiguë trouvée.
           Source=mscorlib
           StackTrace:
                à System.RuntimeType.GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder, CallingConventions callConv, Type[] types, ParameterModifier[] modifiers)
                à System.Type.GetMethod(String name)
                à Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.LockBlockExpression.Emit(IEasyMember member, ILGenerator gen)
                à Castle.DynamicProxy.Builder.CodeBuilder.SimpleAST.ExpressionStatement.Emit(IEasyMember member, ILGenerator gen)
                à Castle.DynamicProxy.Builder.CodeBuilder.AbstractCodeBuilder.Generate(IEasyMember member, ILGenerator il)
                à Castle.DynamicProxy.Builder.CodeBuilder.EasyMethod.Generate()
                à Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.EnsureBuildersAreInAValidState()
                à Castle.DynamicProxy.Builder.CodeBuilder.AbstractEasyType.BuildType()
                à Castle.DynamicProxy.Builder.CodeGenerators.BaseCodeGenerator.CreateType()
                à Castle.DynamicProxy.Builder.CodeGenerators.ClassProxyGenerator.GenerateCode(Type baseClass, Type[] interfaces)
                à Castle.DynamicProxy.Builder.DefaultProxyBuilder.CreateClassProxy(Type theClass, Type[] interfaces)
                à Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type baseClass, Type[] interfaces, IInterceptor interceptor, Boolean checkAbstract, Object[] argumentsForConstructor)
                à NHibernate.Proxy.CastleProxyFactory.GetProxy(Object id, ISessionImplementor session)
           InnerException:
    Si je supprime totalement "Indemnité" (base et classes) tout se passe normalement... Donc c'est bien sur le fait que ce soit un objet attaché à un objet...
    Après quelques heures de recherche sur le net et de debug... j'en suis toujours au même point


    Quelqu'un a une idée de ou cela pourrait venir?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 248
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 248
    Points : 38 956
    Points
    38 956

    Par défaut

    Tu peux montrer le code de ta classe Employe ?

  3. #3
    Futur Membre du Club
    Inscrit en
    mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 38
    Points : 18
    Points
    18

    Par défaut

    Voici ma classe employe

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        public class Employe
        {
            // propriétés automatiques
            public virtual int Id { get; set; }
            public virtual int Version { get; set; }
            public virtual string SS { get; set; }
            public virtual string Nom { get; set; }
            public virtual string Prenom { get; set; }
            public virtual string Adresse { get; set; }
            public virtual string Ville { get; set; }
            public virtual string CodePostal { get; set; }
            public virtual Indemnites Indemnites { get; set; }
     
            // constructeurs
            public Employe()
            {
            }
     
            // ToString
            public override string ToString()
            {
                return string.Format("[{0}|{1}|{2}|{3}|{4}|{5}|{6}]", SS, Nom, Prenom, Adresse, Ville, CodePostal, Indemnites);
            }
        }
    Je viens de tester un truc, j'ai mis lazy à false dans ma hbm

    Code :
    <many-to-one name="Indemnites" column="INDEMNITE_ID" cascade="save-update" lazy="false" />
    Et la je n'ai plus d'erreur et j'ai le bon affichage...
    (or j'affiche indemnite donc j'arrive bien à aller le chercher en base via employe...)

  4. #4
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 248
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 248
    Points : 38 956
    Points
    38 956

    Par défaut

    Bizarre, lazy="false" ne devrait rien changer pourtant

    Enfin bon, tant mieux si ton problème est résolu

  5. #5
    Futur Membre du Club
    Inscrit en
    mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 38
    Points : 18
    Points
    18

    Par défaut

    Je ne dirais pas que mon problème est résolu, mais plutôt que j'ai trouvé une solution temporaire pour pouvoir continuer à coder. J'aimerais quand même trouver de où vient ce problème... Je pense que ça doit être un problème de config, surtout que dans le tuto ça fonctionne...
    Surtout que ça me coute des ressources (requetes en base + transport de données inutile), si j'ai bien compris le principe de lazy...
    Si quelqu'un a une idée sur l'origine du problème je l'accueillerais avec grand plaisir

  6. #6
    Futur Membre du Club
    Inscrit en
    mai 2009
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 38
    Points : 18
    Points
    18

    Par défaut

    Problème résolu...

    Je travail sur Mssql2008 or la dll de nhibernate dans le tuto ne possédait pas le mssql2008dialect. Ayant lu sur le net que ce n'était pas un soucis et qu'on pouvait utiliser celui de 2005 c'est ce que j'ai fait.... Le problème venait de la, une dll plus récente avec le dialect 2008 => problem solved


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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •