septembre
2006
NHibernate 1.2.0.Beta1 est sorti il y’a quelques jours, et j’aimerais parler de quelque unes de ces étonnantes nouvelles fonctionnalités.
La première dont je parlerais est … non non, pas le support des Procédures Stockées Oui, je sais, c’est la nouvelle fonctionnalité la plus attendu; mais Ayende m’a devancé avec son « Using NHibernate With Stored Procedures« .
Donc, qu’est-ce qu’il reste? Les types paramétrés (NH-636)? Le support des projections dans les requètes ICriteria (NH-617)? Le paramètre IList dans Criteria.List (NH-640)? L’optimistic-lock sur les propriétés (NH-713)?
Intéressantes fonctionnalités… Mais, il y’en a d’autres (Ne ratez pas le support du SQL Server batching)
Parlons de RawXmlAttribute (NH-494), c’est un nouvel attribut ajouté à la librairie NHibernate.Mapping.Attributes
Je sais que je parti-pris vus que c’est moi qui ai implémenté cette librarie, mais hey, au moins je sais de quoi je parle
Une rapide introduction à cette librairie: (copier-coller-traduit de la documentation)
NHibernate utilise des informations de mapping pour lier votre modèle de données à votre base de données. Habituellement, elles sont écrites (et maintenu) dans des fichiers hbm.xml. Avec NHibernate.Mapping.Attributes, vous pouvez utiliser des attributs .NET pour décorer vos entités et ces attributs seront utilisés pour générer les mapping .hbm.xml (sous forme de fichiers ou de streams). Ainsi, vous n’avez plus à gérer ces désagréables fichiers XML ;).
Maintenant, le nouvel attribut: (copier-coller-traduit de la documentation)
[RawXmlAttribute] est un nouvel attribut permettant d’insérer du XML tel-quel dans le mapping. Cette fonction peut être très utile pour des mapping complexes (ex: components). Il peut aussi être utilisé pour rapidement déplacer un mapping d’un fichier XML vers des attributs.
Usage:
[RawXml(After=typeof(ComponentAttribute), Content="<component name="...">...</component>")]
« After » dit après quel type de mapping ce XML doit être inséré (en général, c’est le type même du mapping que vous voulez insérer); il est optionnel (auquel cas le XML est inséré au début du mapping).
Note: Actuellement, tous les XMLs sont préfixé par un (dans le stream généré); c’est un effet secondaire connus.
J’ai deux commentaires à faire:
Cet attribut est très important pour NHibernate.Mapping.Attributes. La racine du problème est que les attributs .NET ne sont pas ordonnés. Donc, lorsqu’on définit un mapping avec des attributs, on doit spécifier la position de chaque attribut.
Toutefois, cette solution n’est pas parfaite. La solution parfaite serait de pouvoir spécifier le parent de chaque attribut de sorte à pouvoir créer un véritable graphe; mais ça demanderais la mise à jour de tous les anciens mapping (comment dit on « breaking change » en français? :D) et désormais, faire de simple mapping serait plus difficile (pour le bénéfice de quelques rares cas complexes).
Donc, lorsqu’il est difficile (voire impossible) de définir un mapping avec des attributs, vous pouvez le faire en XML. Il est même possible d’inclure du XML au niveau de
<sql-query name="TousLesProduits">
<return class="Namespaces.Produit, Assembly"/>
SELECT * FROM PRODUIT
</sql-query>
</hibernate-mapping><!--")]
Après avoir généré le fichier/stream, vous devez ajouter –> à sa fin.
Cependant, je ne recommande pas cela (je n’encourage pas la tricherie :P).
Mon second commentaire est l’histoire derrière le <!—-> qui préfixe tous les XMLs générés:
Dans l’implémentation de cette fonction, j’utilise la méthode System.Xml.XmlTextWriter.WriteRaw(« xml »);
Pour quelque raison, cette méthode désactive l’indentation (juste pour l’élément courant). Pourquoi?
Sans entrer dans les détails, mon « workaround » est de commencer un nouvel élément, insérer le XML et fermer cet élément; ainsi, l’indentation n’est désactivée que lors de l’insertion du XML, ce qui est acceptable.
J’ai essayé d’utiliser Seek() pour retirer cet élément factice, mais il ne marche pas correctement. Pourquoi? Heureusement, il marche pour le tag fermant (</!—-> ).
L’astuce c’est que l’élément factice est « !—-« , et l’effet secondaire vient du fait que je ne peux pas l’enlever.
Vous pouvez lire l’implémentation dans:
\nhibernate\src\NHibernate.Mapping.Attributes\HbmWriterEx.cs: Méthode WriteUserDefinedContent()
Donc, qu’est-ce que vous avez appris ici?
– NHibernate 1.2.0.Beta1 est sorti
– Il vient avec plusieurs intéressantes nouvelles fonctionnalités
– Une des plus cool est RawXmlAttribute
– System.Xml semble limité/bugée (ou « Je ne sais pas m’en servir », vous choisissez :D)
– Vous pouvez m’aider à me débarrassé du diabolique <!—->
The End!