Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données > NHibernate
NHibernate Forum d'entraide sur l'utilisation du mappeur objet/relationnel NHibernate.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/04/2011, 16h52   #1
Baptiste_87
Futur Membre du Club
 
Inscription : mai 2009
Messages : 38
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 38
Points : 17
Points : 17
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
Baptiste_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 17h06   #2
tomlev
Rédacteur/Modérateur


 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 17 770
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 31
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 : 17 770
Points : 33 992
Points : 33 992
Tu peux montrer le code de ta classe Employe ?
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 17h13   #3
Baptiste_87
Futur Membre du Club
 
Inscription : mai 2009
Messages : 38
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 38
Points : 17
Points : 17
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...)
Baptiste_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 18h05   #4
tomlev
Rédacteur/Modérateur


 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 17 770
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 31
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 : 17 770
Points : 33 992
Points : 33 992
Bizarre, lazy="false" ne devrait rien changer pourtant

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

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 09h45   #5
Baptiste_87
Futur Membre du Club
 
Inscription : mai 2009
Messages : 38
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 38
Points : 17
Points : 17
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
Baptiste_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 10h02   #6
Baptiste_87
Futur Membre du Club
 
Inscription : mai 2009
Messages : 38
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 38
Points : 17
Points : 17
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

Baptiste_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h52.


 
 
 
 
Partenaires

Hébergement Web