Mapping NHibernate probleme <composite-id> - C#/.NET managed - Programmation
Marsh Posté le 21-04-2011 à 15:29:48
Le temps a passé et tu as sans doute réglé ce problème.
Je répond donc pour les lecteurs suivants éventuels.
Il faut implémenté Equals et GetHashCode dans la classe qui map la clé composite : dans ton cas adecco.Entities.ContratId.
Ces méthodes existe déjà (hérité de object) elles doivent donc être override.
(N)Hibernate à besoin d'un hash code (GetHashCode) pour ordonner les entities et il doit aussi pouvoir comparer ce qu'il fait avec Equals.
Comme c'est un objet complexe (composé de plusieurs objets simples), la comparaison doit être faite explicitement.
Voilou
@+
Marsh Posté le 18-04-2008 à 17:10:03
Bonjour,
je suis en train d'effectuer le mapping de ma base de données avec le framework NHibernate sous Visual Studio 2008.
Je posséde une table "Contrat" qui est associé à une table "Client" et une table "Interimaire".
La table "Contrat" possède donc une clef primaire composé de :
- numContrat
- numClient
- matricule (interimaire)
mon fichier de mapping est le suivant :
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<!--Built with MyGeneration/Template/NHibernate (c) by OHM (alvy77@hotmail.com)
based on NHibernate lujan99 0.9.20 (c) by lujan99@usa.net-->
<class name="adecco.Entities.Contrat,adecco" table="contrat" lazy="false">
<composite-id name="Id" class="adecco.Entities.ContratId,adecco">
<key-property name="NumContrat" column="num_contrat" type="int" />
<key-property name="ClientNumClient" column="client_num_client" type="int" />
<key-property name="InterimaireMatricule" column="interimaire_matricule" type="int" />
</composite-id>
<property type="int" not-null="true" name="TypeAvenantId" column="[type_avenant_id]" />
<property type="int" not-null="true" name="QualificationId" column="[qualification_id]" />
<property type="int" not-null="true" name="StatutContratId" column="[statut_contrat_id]" />
<property type="DateTime" not-null="true" name="DateAvenant" column="[date_avenant]" />
<property type="bool" not-null="true" name="TacheRisque" column="[tache_risque]" />
<property type="bool" not-null="true" name="Intemperie" column="[intemperie]" />
<property type="bool" not-null="true" name="Risque" column="[risque]" />
<property type="bool" not-null="true" name="SurveillanceMedical" column="[surveillance_medical]" />
</class>
</hibernate-mapping>
Je vais maintenant vous présenter la classe Entity "ContratID.cs" :
et bien sur la classe Entity "contrat.cs" :
Lorsque que je compile via mon "Main" : j'obtient l'erreur suivante qui apparemment et normal :
L'application démarre...
System.TypeInitializationException: Une exception a été levée par l'initialiseur
de type pour 'adecco.NHibernateHelper'. ---> NHibernate.MappingException: Could
not compile the mapping document: adecco.Mapping.Contrat.hbm.xml ---> NHibernat
e.MappingException: composite-id class must override Equals(): adecco.Entities.C
ontratId
à NHibernate.Cfg.HbmBinder.BindRootClass(XmlNode node, RootClass model, Mappi
ngs mappings)
à NHibernate.Cfg.HbmBinder.BindRoot(XmlDocument doc, Mappings mappings)
à NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
--- Fin de la trace de la pile d'exception interne ---
à NHibernate.Cfg.Configuration.LogAndThrow(MappingException me)
à NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
à NHibernate.Cfg.Configuration.ProcessMappingsQueue()
à NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument docum
ent)
à NHibernate.Cfg.Configuration.AddXmlReader(XmlTextReader hbmReader, String n
ame)
à NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String n
ame)
à NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly)
à NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly)
à NHibernate.Cfg.Configuration.AddAssembly(String assemblyName)
à NHibernate.Cfg.Configuration.DoConfigure(XmlDocument doc)
à NHibernate.Cfg.Configuration.Configure(XmlTextReader reader)
à NHibernate.Cfg.Configuration.Configure(String fileName)
à NHibernate.Cfg.Configuration.Configure()
à adecco.NHibernateHelper..cctor() dans D:\Mes Documents\Visual Studio 2008\P
rojects\adecco\adecco\NHibernateHelper.cs:ligne 22
--- Fin de la trace de la pile d'exception interne ---
à adecco.NHibernateHelper.GetCurrentSession()
à adecco.Manager.TypeAvenantManager..ctor() dans D:\Mes Documents\Visual Stud
io 2008\Projects\adecco\adecco\Manager\TypeAvenantManager.cs:ligne 20
à adecco.Program.Main(String[] args) dans D:\Mes Documents\Visual Studio 2008
\Projects\adecco\adecco\Program.cs:ligne 22
L'application est fermée!
La ligne que je retient est : composite-id class must override Equals(): adecco.Entities.C
ontratId
Cependant, je ne comprend pas où est ce que je dois implémenter la méthode Equals ?
Est ce que qu'elqu'un pourrait m'aider ?
SVP, c la galère ...
Cordialement,
Olive