Sérialisation, Persistance et Mapping Objet Relationnel
Document Libre.  www.allili.net Sérialisation Mapping O/R Introduction Exemples d’utilisation Mécanisme [Serializable] et [NonSerialized] Sérialisation binaire Sérialisation SOAP Contrôle de la sérialisation  binaire Sérialisation XML Sérialisation Personnalisée Introduction Nhibernate Présentation Architecture Mécanisme Configuration Classe Persistante Déclaration du Mapping Récupération des données Opérations M.A.J 05/06/09
Sérialisation et Persistance
Document Libre.  www.allili.net La  sérialisation  est le processus de sauvegarde de l’état d’un objet à destination d’une zone de stockage La  désérialisation  est le processus inverse, reconstituer l’objet depuis un flux de données. 05/06/09 Objet Sérialisation en flux de données Mémoire Fichiers Base de données
Document Libre.  www.allili.net Avantages : Faciliter le partage d’objets entre applications. Faciliter le transport d’un objet par réseau. Cloner les objects. Inconvénients : Le principal inconvénient est lié aux ressources (CPU, Périphérique IO). La sérialisation XML est non sécurisée. La sérialisation XML est lente. Sérialisation # Persistance : Surtout, il ne faut pas confondre ces deux termes. Sérialisation  : Conversion d’un objet en flux de données. Pas de notion de stockage. Persistance  : fait référence au stockage permanant. 05/06/09
Document Libre.  www.allili.net Quelques exemples d’utilisation : Les applications Windows Clientes : La sérialisation peut être utilisé pour sauvegarder l’état de l’application. Copier / Coller des objets dans le presse papier. Le Remoting .Net Partager des objets à travers le réseau Le Web Services Une classe est particulièrement adaptée au mécanisme de sérialisation. (Format XML) 05/06/09
Document Libre.  www.allili.net Afin de sérialiser un objet en .net, nous avons besoin d’un flux de données et d’un formateur. Le flux de données va contenir l’objet sérialisable. Le formateur sérialise l’objet dans le flux de données selon un format déterminé. Les formateurs disposent de deux principales méthodes : void Serialize(  Stream   serializationStream ,  Object  graph ) { ... } object Deserialize( Stream   serializationStream ) { ... } 05/06/09
Document Libre.  www.allili.net Il ya trois formats fournis par le Framework. NET pour les objets qui peuvent être sérialisé. System.Runtime. Serialization.Formatters Sérialisation personnalisée : Et oui on peut le faire   05/06/09 Les formateurs du Framework .NET Formateur Binaire (Sérialisation Binaire) Formateur SOAP (Sérialisation SOAP) Formateur XML (Sérialisation XML) System.Runtime. Serialization.Formatters System.Xml.Serialization.XmlSerializer
Document Libre.  www.allili.net Afin qu’une classe peux être sérialiser on doit placer l’attribut [Serilizable] en tête de la classe. Cet Attribut concerne seulement une Sérialisation binaire. Si une classe est précédée par [Serializable], alors tous les attributs sont sérialisés, sauf qui sont précédés par [NonSerialized]. [NonSerialized] indique qu’un attribut ne sera pas sérialiser. La sérialisation d’une classe non précédée par [Serializable] déclenche une exception de type SerializationException Exemple : [Serializable] public   class  Employee {     public   int  empCode;     public   string  empName; } 05/06/09
Document Libre.  www.allili.net BinaryFormatter  :  Il y a émission d’octets en flux continu à partir d’un ou plusieurs objets.  La sérialisation binaire fournit un moyen de persister un objet de telle manière que l'objet peut être reconstruit automatiquement. Elle est destiné à sauver l'état d'un objet qui sera partagé par un autre .NET programme ou par le même programme à un moment ultérieur. Elle stocke tout l’état de l'objet, y compris le type d'information, d’une façon fidèle à l’origine. Seules les applications qui ont accès à l’assembly qui contient le type de définition de l’objet peuvent le désérialiser. Exemple :  05/06/09
Document Libre.  www.allili.net Sérialisation : public   void  Serialiser( string  fichier, Employee emp) {    FileStream fstr=null;  //Using System.IO;    try    {      fstr  =   new  FileStream(fichier, FileMode.Create);      BinaryFormatter biformatter  =   new  BinaryFormatter();      binformatter.Serialize(fstr, emp);    }    finally    {      fstr.Close();    } } 05/06/09
Document Libre.  www.allili.net Désérialisation : public   static   employee  Deserialiser( string  fichier) {    FileStream fstr;      try    {      fstr  =   new  FileStream(fichier, FileMode.Open);      BinaryFormatter binformatter  =   new  BinaryFormatter();      return  ((Employee)binformatter.Deserialize(fstr));    }    finally    {      fstr.Close();    } } 05/06/09
Document Libre.  www.allili.net Démos : Serialisation_Binaire 05/06/09
Document Libre.  www.allili.net SOAP est le protocole idéal pour la communication entre les applications qui utilise des architectures hétérogènes.(Web Services) SoapFormatter  :  Emission d’un flux XML en utilisant les spécifications de SOAP. La sérialisation binaire fournit un moyen de persister un objet de telle manière que l'objet peut être reconstruit automatiquement. Le formateur SOAP stocke les mêmes informations que le formateur binaire, mais dans le format SOAP. Le formateur SOAP produit un flux qui a une taille plus grande que celle produite par le formateur binaire. (Tous les types sont considérés comme des chaines.) La Sérialisation SOAP est facilement transportée par réseau. N.B : Il faut importer manuellement la DLL : System.Runtime.Serialization.Formatters.Soap.dll 05/06/09
Document Libre.  www.allili.net Exemple de Sérialisation : Exemple de Désérialisation : public   void  SOAPSerialisation( string  fichier, Employee emp) {    FileStream fstr  =   new  FileStream(fichier, FileMode.Create);    SoapFormatter soapformatter  =   new  SoapFormatter();    soapformatter.Serialize(fstr, emp);    fstr.Close(); } public   static   Employee  SOAPDeserialisation( string  fichier) {    FileStream fstr  =   new  FileStream(filename, FileMode.Open);    SoapFormatter soapformatter  =   new  SoapFormatter();    Employee  emp  =  ( Employee )soapformatter.Deserialize(fstr);    fstr.Close();    return  emp; } 05/06/09
Document Libre.  www.allili.net Démos : Serialisation_SOAP 05/06/09
Document Libre.  www.allili.net [NonSerialized] : Dans certaines situations, on ne veut pas sérialiser tout les attributs de la classe. Objet d’objet : Lors de la sérialisation d’un objet x de la classe X qui contient un objet y comme attribut, la classe Y doit être marquée par [Serialisable]. Héritage : l’attribut [Serialisable] n’est pas héréditaire. La classe fille doit être marquée par cet attribut. Démos : Controle_Serialisation Serialisation_Binaire_Liste Serialisation_Binaire_Heritage 05/06/09
Document Libre.  www.allili.net La sérialisation XML produit des données peuvent être lues par n'importe quelle application qui comprend XML, indépendamment des programmes ou des plates formes. Elle donne au programmeur une très large souplesse dans la personnalisation de la sortie.  On peut spécifier si un champ est un attribut ou un élément, déterminer l'espace de noms XML… La sérialisation XML sérialise uniquement les propriétés et champs publics (get et set) et ne préserve pas la fidélité des types. La classe de base pour réaliser une sérialisation XML est :  System.Xml.Serialization.XmlSerializer 05/06/09
Document Libre.  www.allili.net La Sérialisation XML peut être contrôlé par des attributs : XmlRoot : représente le nom de la racine du document XML de, donc ne vaut que pour une classe. XmlAttribute : représente un attribut XML. XmlElement : représente un élément XML. XmlArray : représente un tableau XML. XmlArrayItem : représente un élément du tableau XML. …  (tout ce qu’on peut mettre dans un documents XML   ) Exemple : [XmlAttribute( "empName" )] public   string  EmpName {    get{ return  empName;}    set{empName  =  value;} } 05/06/09
Document Libre.  www.allili.net Exemple de Sérialisation : public   void  XMLSerialiser(Employee emp, String fichier) {    XmlSerializer serializer  =   null ;  //Using System.XML.Serialization;    FileStream stream  =   null ;    try    {      serializer  =   new  XmlSerializer( typeof (Employee));      stream  =   new  FileStream(fichier, FileMode.Create, FileAccess.Write);      serializer.Serialize(stream, emp);    }    finally    {      if  (stream ! =   null )        stream.Close();    } } 05/06/09
Document Libre.  www.allili.net Exemple de Désérialisation : public   static  Employee XMLDeserialiser(String fichier) {    XmlSerializer deser  =   null ;    FileStream stream  =   null ;    Employee emp  =   new  Employee();    try {      deser  =   new  XmlSerializer( typeof (Employee));      stream  =   new  FileStream(fichier, FileMode.Open);      emp  =  (Employee)deser.Deserialize(stream);    }    finally {      if  (stream ! =   null )        stream.Close();    }    return  emp; } 05/06/09
Document Libre.  www.allili.net Démos : Serialisation_XML_non_formate Serialisation_XML_formate XML_Objet_Objet XML_Liste 05/06/09
Document Libre.  www.allili.net Dans certains cas la sérialisation classique n’est pas suffisante. Ajout du traitement lors de la sérialisation. Contrôle de la sérialisation. La Sérialisation personnalisée, est réalisée en implémentant l’interface «  ISerializable  » void   ISerializable .GetObjectData( SerializationInfo  info,  StreamingContext  context) { ...  // La Sérialisation Personalisée } protected  Object( SerializationInfo  info,  StreamingContext  context) { ...   // Constructeur pour la désérialisaton } 05/06/09
Document Libre.  www.allili.net Démos : Serialisation_Personalise Serial_Perso_Collection 05/06/09
Mapping O/R
Document Libre.  www.allili.net Base de données != Objets Base de données : Tables, colonnes, type simples … Clés : primaires, étrangères, index ... Relations Héritage Objets : Classe, champs, propriété. Compositions (Type Complexe). Relations Héritage, Polymorphisme 05/06/09
Document Libre.  www.allili.net Les difficultés de cohabitation entre les mondes objets et relationnels sont résolues grâce au concept de  Mapping objet-relationnel  (O/R Mapping), qui est le nom donné aux techniques de transformation des modèles objets en modèles relationnels. Le mapping Objet Relationnel (O.R.M), est une technique qui permet de créer l’illusion d’une base de données orienté objet à partir d’une base de données relationnel en définissant une correspondance entre cette base et des classes (objets). M.O.R permet d'appliquer une analyse et une modélisation orienté-objet proprement en cachant les spécificités liées à l'usage d'un système relationnel. 05/06/09 Base de données Mapping O.R Objets
Document Libre.  www.allili.net Un logiciel de Mapping Objet / Relationnel est une couche de persistance connectant les objets d'un système orienté-objet à des données stockées dans une base de données relationnel. Il permet d'appliquer une analyse et une modélisation orienté-objet proprement en cachant les spécificités liées à l'usage d'un système relationnel.  Il existe plusieurs types de logiciels de Mapping Objet / Relationnel : Purement Relationnel: Pas de MOR; utilise des tables et des lignes. Mapping Objet Faible: des lignes de tables sont manuellement converties en objets.  Mapping Objet Intermédiaire: L'application est conçus avec des objets. Les associations et collections peuvent être mappées.  Mapping Objet Total: Solution plus avancée que le Mapping Objet Intermédiaire; elle permet des liaisons complexes .Net est compatible avec plusieurs Logiciels Mapping OR: ADO.NET, Opf3, Evaluant DTM, ObjectSpace,  Nhibernate  … 05/06/09
Document Libre.  www.allili.net NHibernate  est le portage de l'excellent  Hibernate, outil de persistance relationnel vers la plate-forme .NET Une solution dominante pour le mapping objet / relationnel (MOR) et la persistance d'objets. Nhibernate est flexible : on peut définir comment persister chaque propriété et relation. Nhibernate permet d’effectuer des requêtes en utilisant un langage de requête très concis et puissant. NHibernate utilise l'API. NET, et ne génère pas de code supplémentaire ou du Bytecode. Nhibernate est Open Source (Sous licence LGPL). Nhibernate est indépendant des SGBD. Pour utiliser Nhibernate dans un projet .Net il faut importer les DLL : NHibernate.dll log4net.dll NHibernate.Mapping.Attributes.dl 05/06/09
Document Libre.  www.allili.net Nhibernate ajoute une couche de persistance entre la couche d’accès au donnée set l’application. 05/06/09
Document Libre.  www.allili.net 05/06/09
Document Libre.  www.allili.net Le fichier de configuration doit être chargé avec l'objet Configuration L'assembly qui contient toute la couche métier doit être chargée avec  l'instance de Configuration déjà crée. L’instanciation d’un objet factory avec l’objet de configuration. A chaque fois qu'il est nécessaire de faire un traitement sur la base de données, il est nécessaire de créer une nouvelle session avec L’objet factory. Si nécessaire, l’utilisation des transaction avec l’objet session pour bénéficier du mécanisme de transactions, avec la possibilité de commit et de rollback. A la fin de la session (lorsque les données sont traitées), l faut fermer la session. (également faire un commit la transaction) A la fermeture du programme, on ferme la factory (ce qui ferme proprement la connexion à la base de données) 05/06/09
Document Libre.  www.allili.net En général le fichier de configuration est nommé &quot;App.config&quot; pour une application windows, ou &quot;Web.config&quot; pour une application Web (en ASP.NET), est située à la racine du projet qui contient l‘executable. ce n'est pas un fichier NHibernate proprement dit. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> … </configSections> <nhibernate> … </nhibernate> </configuration>
Document Libre.  www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration>
Document Libre.  www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> Déclaration de la section NHibernate qui va suivre
Document Libre.  www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> Début de la section NHibernate pour le fichier de configuration 4 clefs sont importantes
Document Libre.  www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> La première est liée à la méthode utilisée par NHibernate pour se connecter
Document Libre.  www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> La seconde clef est liée au dialecte (Langage SQL)
Document Libre.  www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> La troisième clef est liée au driver utilisé par NHibernate pour communiquer avec la base de données
Document Libre.  www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> Une dernière clef est liée à la chaîne de connexion
Document Libre.  www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();       cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();       session = factory.OpenSession();       ITransaction t = session.BeginTransaction(); … …  …        t.Commit();        session.Flush();        session.Close();        factory.Close();
Document Libre.  www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();       cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();       session = factory.OpenSession();       ITransaction t = session.BeginTransaction(); … …  …        t.Commit();        session.Flush();        session.Close();        factory.Close(); Le chargement de la configuration. l'objet va se charger lui-même avec les paramètres données dans le fichiers de configuration
Document Libre.  www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();        cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();       session = factory.OpenSession();       ITransaction t = session.BeginTransaction(); … …  …        t.Commit();        session.Flush();        session.Close();        factory.Close(); L'objet configuration charge l'assembly qui contient la couche métier
Document Libre.  www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();       cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();       session = factory.OpenSession();       ITransaction t = session.BeginTransaction(); … …  …        t.Commit();        session.Flush();        session.Close();        factory.Close(); Création d’un objet session factory
Document Libre.  www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();       cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();       session = factory.OpenSession();       ITransaction t = session.BeginTransaction(); … …  …        t.Commit();        session.Flush();        session.Close();        factory.Close(); Création d’un e session avec la méthode OpenSession
Document Libre.  www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();       cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();       session = factory.OpenSession();       ITransaction t = session.BeginTransaction(); … …  …        t.Commit();        session.Flush();        session.Close();        factory.Close(); Création d’une transaction
Document Libre.  www.allili.net La classe persistante doit implémenter son constructeur par défaut explicitement. Nhibernate persiste les propriétés qui implémentent les getters et les setters. (même les propriétés qui ne sont pas public). Il est préférable de persistés des classe non-sealed, et d’indiquer le mot « virtual » pour les méthodes. 05/06/09 class Personne { private int id; private string nom; public virtual int Id { get { return id; } set { id = value; } }
Document Libre.  www.allili.net La classe persistante doit implémenter son constructeur par défaut explicitement. Nhibernate persiste les propriétés qui implémentent les getters et les setters. (même les propriétés qui ne sont pas public). Il est préférable de persistés des classe non-sealed, et d’indiquer le mot « virtual » pour les méthodes. 05/06/09 public virtual string Nom { get { return nom; } set { nom = value; } } public Personne() { } public Personne(int id, string nom)  { this.id = id; this.nom = nom; } } // de la classe
Document Libre.  www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot;  table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;native&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping>
Document Libre.  www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot;  table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;native&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> Déclaration du fichier de mapping
Document Libre.  www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot;  table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;native&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> Définit le nom de la classe et le nom de la table dans laquelle la classe est persistée
Document Libre.  www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot;  table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;identity&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> Mappe la clef primaire de la table à un membre de la classe.
Document Libre.  www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot;  table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;identity&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> La méthode par laquelle la clef primaire sera créée. « identity » indique que la clef primaire est automatiquement générée par la base de données
Document Libre.  www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot;  table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;identity&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> La balise property est la façon la plus simple de mapper un champ de la base de données à un membre d'une classe
Document Libre.  www.allili.net Il y a trois façons de construire des requêtes avec Nhibernate : Requête SQL native : utiliser une requête directement dans le dialecte de la BDD sous jacente va engendrer une perte de portabilité. Il vaut mieux l’éviter. Requête HQL (Hibernate Query Languge) : Ressemble beaucoup à du SQL. Manipule directement des objets au lieu de tables Ces Requêtes sont indépendantes des SGBD. Requêtes Criteria : Ces requêtes sont construites avec les Factory. Ils sont orientées objets, et indépendantes des SGBD. 05/06/09
Document Libre.  www.allili.net Requêtes SQL native  : Le résultat une IList qui contient les éléments conformes aux critères. 05/06/09 Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); IList listepres = session.CreateSQLQuery(&quot;select * from personne&quot;, &quot;Personne&quot;, typeof(Personne)).List(); foreach (Personne pers in listepers) Console.WriteLine(pers.Id+” “+pers.Nom+” “+pers.Prenom); session.Close(); factory.Close();
Document Libre.  www.allili.net Requêtes HQL  : Le résultat une IList qui contient les éléments conformes aux critères. 05/06/09 Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); IList listepers = session.CreateQuery(&quot;from Personne&quot;).List(); foreach (Personne pers in listepers) Console.WriteLine(pers.Id+” “+pers.Nom+” “+pers.Prenom); session.Close(); factory.Close();
Document Libre.  www.allili.net Requêtes Criteria  : Le résultat est un ICriteria qui contient comme attributs une liste des éléments conformes aux critères. 05/06/09 Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); ICriteria c = session.CreateCriteria(typeof(Personne)) .  Add(Expression.Eq(“Nom&quot;, “root@khalid&quot;)); foreach (Personne pers in  c.List() ) Console.WriteLine(pers.Id+” “+pers.Nom+” “+pers.Prenom); session.Close(); factory.Close();
Document Libre.  www.allili.net La méthode load de ISession  : Si on connaît l’identifiant, on peu utiliser la méthode load de l’instance ISession. Le résultat est une instance de la classe persistante. 05/06/09 Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); Console.Write(&quot;Entrer le id : &quot;); int id = Convert.ToInt32(Console.ReadLine()); Personne pers = new Personne(); session.Load(pers, id); Console.WriteLine(pers.Nom+ &quot; &quot; + pers.Prenom); session.Close(); factory.Close();
Document Libre.  www.allili.net 05/06/09 Insertion  : Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); ITransaction tr = session.BeginTransaction(); Console.Write(&quot;Entrer le id : &quot;); int id = Convert.ToInt32(Console.ReadLine());  Console.Write(&quot;Entrer le nom : &quot;); String nom=Console.ReadLine(); Personne pers = new Personne(id, nom); session.save(pers, id); tr.commit(); session.Close(); factory.Close();
Document Libre.  www.allili.net 05/06/09 Modification  : Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); ITransaction tr = session.BeginTransaction(); Console.Write(&quot;Entrer le id à modifier: &quot;); int id = Convert.ToInt32(Console.ReadLine());  Console.Write(&quot;Entrer le nouveau nom : &quot;); String nom=Console.ReadLine(); Personne pers = new Personne(id, nom); session.save(pers); tr.commit(); session.Close(); factory.Close();
Document Libre. 05/06/09 Suppression  : Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); ITransaction tr = session.BeginTransaction(); Console.Write(&quot;Entrer le id à supprimer : &quot;); int id = Convert.ToInt32(Console.ReadLine());  Console.Write(&quot;Entrer le nom : &quot;); String nom=Console.ReadLine(); Personne pers = new Personne(id, nom); session.delete(pers); tr.commit(); session.Close(); factory.Close();
Document Libre.  www.allili.net Démos : Mapping_Personne 05/06/09
 

Sérialisation, Persistance Et Mapping Objet Relationnel

  • 1.
    Sérialisation, Persistance etMapping Objet Relationnel
  • 2.
    Document Libre. www.allili.net Sérialisation Mapping O/R Introduction Exemples d’utilisation Mécanisme [Serializable] et [NonSerialized] Sérialisation binaire Sérialisation SOAP Contrôle de la sérialisation binaire Sérialisation XML Sérialisation Personnalisée Introduction Nhibernate Présentation Architecture Mécanisme Configuration Classe Persistante Déclaration du Mapping Récupération des données Opérations M.A.J 05/06/09
  • 3.
  • 4.
    Document Libre. www.allili.net La sérialisation est le processus de sauvegarde de l’état d’un objet à destination d’une zone de stockage La désérialisation est le processus inverse, reconstituer l’objet depuis un flux de données. 05/06/09 Objet Sérialisation en flux de données Mémoire Fichiers Base de données
  • 5.
    Document Libre. www.allili.net Avantages : Faciliter le partage d’objets entre applications. Faciliter le transport d’un objet par réseau. Cloner les objects. Inconvénients : Le principal inconvénient est lié aux ressources (CPU, Périphérique IO). La sérialisation XML est non sécurisée. La sérialisation XML est lente. Sérialisation # Persistance : Surtout, il ne faut pas confondre ces deux termes. Sérialisation  : Conversion d’un objet en flux de données. Pas de notion de stockage. Persistance : fait référence au stockage permanant. 05/06/09
  • 6.
    Document Libre. www.allili.net Quelques exemples d’utilisation : Les applications Windows Clientes : La sérialisation peut être utilisé pour sauvegarder l’état de l’application. Copier / Coller des objets dans le presse papier. Le Remoting .Net Partager des objets à travers le réseau Le Web Services Une classe est particulièrement adaptée au mécanisme de sérialisation. (Format XML) 05/06/09
  • 7.
    Document Libre. www.allili.net Afin de sérialiser un objet en .net, nous avons besoin d’un flux de données et d’un formateur. Le flux de données va contenir l’objet sérialisable. Le formateur sérialise l’objet dans le flux de données selon un format déterminé. Les formateurs disposent de deux principales méthodes : void Serialize( Stream serializationStream , Object graph ) { ... } object Deserialize( Stream serializationStream ) { ... } 05/06/09
  • 8.
    Document Libre. www.allili.net Il ya trois formats fournis par le Framework. NET pour les objets qui peuvent être sérialisé. System.Runtime. Serialization.Formatters Sérialisation personnalisée : Et oui on peut le faire  05/06/09 Les formateurs du Framework .NET Formateur Binaire (Sérialisation Binaire) Formateur SOAP (Sérialisation SOAP) Formateur XML (Sérialisation XML) System.Runtime. Serialization.Formatters System.Xml.Serialization.XmlSerializer
  • 9.
    Document Libre. www.allili.net Afin qu’une classe peux être sérialiser on doit placer l’attribut [Serilizable] en tête de la classe. Cet Attribut concerne seulement une Sérialisation binaire. Si une classe est précédée par [Serializable], alors tous les attributs sont sérialisés, sauf qui sont précédés par [NonSerialized]. [NonSerialized] indique qu’un attribut ne sera pas sérialiser. La sérialisation d’une classe non précédée par [Serializable] déclenche une exception de type SerializationException Exemple : [Serializable] public   class  Employee {     public   int  empCode;     public   string  empName; } 05/06/09
  • 10.
    Document Libre. www.allili.net BinaryFormatter  : Il y a émission d’octets en flux continu à partir d’un ou plusieurs objets. La sérialisation binaire fournit un moyen de persister un objet de telle manière que l'objet peut être reconstruit automatiquement. Elle est destiné à sauver l'état d'un objet qui sera partagé par un autre .NET programme ou par le même programme à un moment ultérieur. Elle stocke tout l’état de l'objet, y compris le type d'information, d’une façon fidèle à l’origine. Seules les applications qui ont accès à l’assembly qui contient le type de définition de l’objet peuvent le désérialiser. Exemple : 05/06/09
  • 11.
    Document Libre. www.allili.net Sérialisation : public   void  Serialiser( string  fichier, Employee emp) {    FileStream fstr=null; //Using System.IO;    try    {      fstr  =   new  FileStream(fichier, FileMode.Create);      BinaryFormatter biformatter  =   new BinaryFormatter();      binformatter.Serialize(fstr, emp);    }    finally    {      fstr.Close();    } } 05/06/09
  • 12.
    Document Libre. www.allili.net Désérialisation : public   static   employee  Deserialiser( string fichier) {    FileStream fstr;      try    {      fstr  =   new  FileStream(fichier, FileMode.Open);      BinaryFormatter binformatter  =   new BinaryFormatter();      return  ((Employee)binformatter.Deserialize(fstr));    }    finally    {      fstr.Close();    } } 05/06/09
  • 13.
    Document Libre. www.allili.net Démos : Serialisation_Binaire 05/06/09
  • 14.
    Document Libre. www.allili.net SOAP est le protocole idéal pour la communication entre les applications qui utilise des architectures hétérogènes.(Web Services) SoapFormatter  : Emission d’un flux XML en utilisant les spécifications de SOAP. La sérialisation binaire fournit un moyen de persister un objet de telle manière que l'objet peut être reconstruit automatiquement. Le formateur SOAP stocke les mêmes informations que le formateur binaire, mais dans le format SOAP. Le formateur SOAP produit un flux qui a une taille plus grande que celle produite par le formateur binaire. (Tous les types sont considérés comme des chaines.) La Sérialisation SOAP est facilement transportée par réseau. N.B : Il faut importer manuellement la DLL : System.Runtime.Serialization.Formatters.Soap.dll 05/06/09
  • 15.
    Document Libre. www.allili.net Exemple de Sérialisation : Exemple de Désérialisation : public   void  SOAPSerialisation( string fichier, Employee emp) {    FileStream fstr  =   new FileStream(fichier, FileMode.Create);    SoapFormatter soapformatter  =   new SoapFormatter();    soapformatter.Serialize(fstr, emp);    fstr.Close(); } public   static   Employee  SOAPDeserialisation( string fichier) {    FileStream fstr  =   new FileStream(filename, FileMode.Open);    SoapFormatter soapformatter  =   new SoapFormatter();    Employee  emp  = ( Employee )soapformatter.Deserialize(fstr);    fstr.Close();    return  emp; } 05/06/09
  • 16.
    Document Libre. www.allili.net Démos : Serialisation_SOAP 05/06/09
  • 17.
    Document Libre. www.allili.net [NonSerialized] : Dans certaines situations, on ne veut pas sérialiser tout les attributs de la classe. Objet d’objet : Lors de la sérialisation d’un objet x de la classe X qui contient un objet y comme attribut, la classe Y doit être marquée par [Serialisable]. Héritage : l’attribut [Serialisable] n’est pas héréditaire. La classe fille doit être marquée par cet attribut. Démos : Controle_Serialisation Serialisation_Binaire_Liste Serialisation_Binaire_Heritage 05/06/09
  • 18.
    Document Libre. www.allili.net La sérialisation XML produit des données peuvent être lues par n'importe quelle application qui comprend XML, indépendamment des programmes ou des plates formes. Elle donne au programmeur une très large souplesse dans la personnalisation de la sortie. On peut spécifier si un champ est un attribut ou un élément, déterminer l'espace de noms XML… La sérialisation XML sérialise uniquement les propriétés et champs publics (get et set) et ne préserve pas la fidélité des types. La classe de base pour réaliser une sérialisation XML est : System.Xml.Serialization.XmlSerializer 05/06/09
  • 19.
    Document Libre. www.allili.net La Sérialisation XML peut être contrôlé par des attributs : XmlRoot : représente le nom de la racine du document XML de, donc ne vaut que pour une classe. XmlAttribute : représente un attribut XML. XmlElement : représente un élément XML. XmlArray : représente un tableau XML. XmlArrayItem : représente un élément du tableau XML. … (tout ce qu’on peut mettre dans un documents XML  ) Exemple : [XmlAttribute( &quot;empName&quot; )] public   string  EmpName {    get{ return  empName;}    set{empName  =  value;} } 05/06/09
  • 20.
    Document Libre. www.allili.net Exemple de Sérialisation : public   void  XMLSerialiser(Employee emp, String fichier) {    XmlSerializer serializer  =   null ; //Using System.XML.Serialization;    FileStream stream  =   null ;    try    {      serializer  =   new XmlSerializer( typeof (Employee));      stream  =   new  FileStream(fichier, FileMode.Create, FileAccess.Write);      serializer.Serialize(stream, emp);    }    finally    {      if  (stream ! =   null )        stream.Close();    } } 05/06/09
  • 21.
    Document Libre. www.allili.net Exemple de Désérialisation : public   static  Employee XMLDeserialiser(String fichier) {    XmlSerializer deser  =   null ;    FileStream stream  =   null ;    Employee emp  =   new  Employee();    try {      deser  =   new XmlSerializer( typeof (Employee));      stream  =   new  FileStream(fichier, FileMode.Open);      emp  =  (Employee)deser.Deserialize(stream);    }    finally {      if  (stream ! =   null )        stream.Close();    }    return  emp; } 05/06/09
  • 22.
    Document Libre. www.allili.net Démos : Serialisation_XML_non_formate Serialisation_XML_formate XML_Objet_Objet XML_Liste 05/06/09
  • 23.
    Document Libre. www.allili.net Dans certains cas la sérialisation classique n’est pas suffisante. Ajout du traitement lors de la sérialisation. Contrôle de la sérialisation. La Sérialisation personnalisée, est réalisée en implémentant l’interface «  ISerializable  » void ISerializable .GetObjectData( SerializationInfo info, StreamingContext context) { ... // La Sérialisation Personalisée } protected Object( SerializationInfo info, StreamingContext context) { ... // Constructeur pour la désérialisaton } 05/06/09
  • 24.
    Document Libre. www.allili.net Démos : Serialisation_Personalise Serial_Perso_Collection 05/06/09
  • 25.
  • 26.
    Document Libre. www.allili.net Base de données != Objets Base de données : Tables, colonnes, type simples … Clés : primaires, étrangères, index ... Relations Héritage Objets : Classe, champs, propriété. Compositions (Type Complexe). Relations Héritage, Polymorphisme 05/06/09
  • 27.
    Document Libre. www.allili.net Les difficultés de cohabitation entre les mondes objets et relationnels sont résolues grâce au concept de Mapping objet-relationnel (O/R Mapping), qui est le nom donné aux techniques de transformation des modèles objets en modèles relationnels. Le mapping Objet Relationnel (O.R.M), est une technique qui permet de créer l’illusion d’une base de données orienté objet à partir d’une base de données relationnel en définissant une correspondance entre cette base et des classes (objets). M.O.R permet d'appliquer une analyse et une modélisation orienté-objet proprement en cachant les spécificités liées à l'usage d'un système relationnel. 05/06/09 Base de données Mapping O.R Objets
  • 28.
    Document Libre. www.allili.net Un logiciel de Mapping Objet / Relationnel est une couche de persistance connectant les objets d'un système orienté-objet à des données stockées dans une base de données relationnel. Il permet d'appliquer une analyse et une modélisation orienté-objet proprement en cachant les spécificités liées à l'usage d'un système relationnel. Il existe plusieurs types de logiciels de Mapping Objet / Relationnel : Purement Relationnel: Pas de MOR; utilise des tables et des lignes. Mapping Objet Faible: des lignes de tables sont manuellement converties en objets. Mapping Objet Intermédiaire: L'application est conçus avec des objets. Les associations et collections peuvent être mappées. Mapping Objet Total: Solution plus avancée que le Mapping Objet Intermédiaire; elle permet des liaisons complexes .Net est compatible avec plusieurs Logiciels Mapping OR: ADO.NET, Opf3, Evaluant DTM, ObjectSpace, Nhibernate … 05/06/09
  • 29.
    Document Libre. www.allili.net NHibernate est le portage de l'excellent  Hibernate, outil de persistance relationnel vers la plate-forme .NET Une solution dominante pour le mapping objet / relationnel (MOR) et la persistance d'objets. Nhibernate est flexible : on peut définir comment persister chaque propriété et relation. Nhibernate permet d’effectuer des requêtes en utilisant un langage de requête très concis et puissant. NHibernate utilise l'API. NET, et ne génère pas de code supplémentaire ou du Bytecode. Nhibernate est Open Source (Sous licence LGPL). Nhibernate est indépendant des SGBD. Pour utiliser Nhibernate dans un projet .Net il faut importer les DLL : NHibernate.dll log4net.dll NHibernate.Mapping.Attributes.dl 05/06/09
  • 30.
    Document Libre. www.allili.net Nhibernate ajoute une couche de persistance entre la couche d’accès au donnée set l’application. 05/06/09
  • 31.
    Document Libre. www.allili.net 05/06/09
  • 32.
    Document Libre. www.allili.net Le fichier de configuration doit être chargé avec l'objet Configuration L'assembly qui contient toute la couche métier doit être chargée avec l'instance de Configuration déjà crée. L’instanciation d’un objet factory avec l’objet de configuration. A chaque fois qu'il est nécessaire de faire un traitement sur la base de données, il est nécessaire de créer une nouvelle session avec L’objet factory. Si nécessaire, l’utilisation des transaction avec l’objet session pour bénéficier du mécanisme de transactions, avec la possibilité de commit et de rollback. A la fin de la session (lorsque les données sont traitées), l faut fermer la session. (également faire un commit la transaction) A la fermeture du programme, on ferme la factory (ce qui ferme proprement la connexion à la base de données) 05/06/09
  • 33.
    Document Libre. www.allili.net En général le fichier de configuration est nommé &quot;App.config&quot; pour une application windows, ou &quot;Web.config&quot; pour une application Web (en ASP.NET), est située à la racine du projet qui contient l‘executable. ce n'est pas un fichier NHibernate proprement dit. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> … </configSections> <nhibernate> … </nhibernate> </configuration>
  • 34.
    Document Libre. www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration>
  • 35.
    Document Libre. www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> Déclaration de la section NHibernate qui va suivre
  • 36.
    Document Libre. www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> Début de la section NHibernate pour le fichier de configuration 4 clefs sont importantes
  • 37.
    Document Libre. www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> La première est liée à la méthode utilisée par NHibernate pour se connecter
  • 38.
    Document Libre. www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> La seconde clef est liée au dialecte (Langage SQL)
  • 39.
    Document Libre. www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> La troisième clef est liée au driver utilisé par NHibernate pour communiquer avec la base de données
  • 40.
    Document Libre. www.allili.net 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;/> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;/> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MsSql2000Dialect&quot;/> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.SqlClientDriver&quot;/> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Data Source=root;Initial Catalog=mapping;Integrated Security=SSPI&quot;/> </nhibernate> </configuration> Une dernière clef est liée à la chaîne de connexion
  • 41.
    Document Libre. www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();      cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();      session = factory.OpenSession();      ITransaction t = session.BeginTransaction(); … …  …       t.Commit();       session.Flush();       session.Close();        factory.Close();
  • 42.
    Document Libre. www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();      cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();      session = factory.OpenSession();      ITransaction t = session.BeginTransaction(); … …  …       t.Commit();       session.Flush();       session.Close();        factory.Close(); Le chargement de la configuration. l'objet va se charger lui-même avec les paramètres données dans le fichiers de configuration
  • 43.
    Document Libre. www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();      cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();      session = factory.OpenSession();      ITransaction t = session.BeginTransaction(); … …  …       t.Commit();       session.Flush();       session.Close();        factory.Close(); L'objet configuration charge l'assembly qui contient la couche métier
  • 44.
    Document Libre. www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();      cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();      session = factory.OpenSession();      ITransaction t = session.BeginTransaction(); … …  …       t.Commit();       session.Flush();       session.Close();        factory.Close(); Création d’un objet session factory
  • 45.
    Document Libre. www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();      cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();      session = factory.OpenSession();      ITransaction t = session.BeginTransaction(); … …  …       t.Commit();       session.Flush();       session.Close();        factory.Close(); Création d’un e session avec la méthode OpenSession
  • 46.
    Document Libre. www.allili.net Le fichier de configuration permet au Nhibernate de communiquer avec la base de données. Après la création du fichier de configuration il faut initialiser Nhibernate. 05/06/09 Configuration cfg = new Configuration();      cfg.AddAssembly(“Mon_Assembly&quot;);       ISessionFactory factory = cfg.BuildSessionFactory();      session = factory.OpenSession();      ITransaction t = session.BeginTransaction(); … …  …       t.Commit();       session.Flush();       session.Close();        factory.Close(); Création d’une transaction
  • 47.
    Document Libre. www.allili.net La classe persistante doit implémenter son constructeur par défaut explicitement. Nhibernate persiste les propriétés qui implémentent les getters et les setters. (même les propriétés qui ne sont pas public). Il est préférable de persistés des classe non-sealed, et d’indiquer le mot « virtual » pour les méthodes. 05/06/09 class Personne { private int id; private string nom; public virtual int Id { get { return id; } set { id = value; } }
  • 48.
    Document Libre. www.allili.net La classe persistante doit implémenter son constructeur par défaut explicitement. Nhibernate persiste les propriétés qui implémentent les getters et les setters. (même les propriétés qui ne sont pas public). Il est préférable de persistés des classe non-sealed, et d’indiquer le mot « virtual » pour les méthodes. 05/06/09 public virtual string Nom { get { return nom; } set { nom = value; } } public Personne() { } public Personne(int id, string nom) { this.id = id; this.nom = nom; } } // de la classe
  • 49.
    Document Libre. www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot; table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;native&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping>
  • 50.
    Document Libre. www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot; table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;native&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> Déclaration du fichier de mapping
  • 51.
    Document Libre. www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot; table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;native&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> Définit le nom de la classe et le nom de la table dans laquelle la classe est persistée
  • 52.
    Document Libre. www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot; table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;identity&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> Mappe la clef primaire de la table à un membre de la classe.
  • 53.
    Document Libre. www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot; table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;identity&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> La méthode par laquelle la clef primaire sera créée. « identity » indique que la clef primaire est automatiquement générée par la base de données
  • 54.
    Document Libre. www.allili.net La déclaration du mapping d’une classe vers une table, est effectuer via un fichier XML. Il s’agit d’un fichier XML dont le nom est de la forme : Nom_classe.hbm.xml Le &quot;hbm&quot; dans le nom de fichier est très important, puisque c'est grâce à lui, NHibernate le détecte comme un fichier de mapping. 05/06/09 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.2&quot; namespace=&quot;Mapping_Personne&quot;> <class name=&quot;Mapping_Personne.Personne&quot; table=&quot;personne&quot;> <id name=&quot;Id&quot; column=&quot;id&quot; type=&quot;Int32&quot;> <generator class=&quot;identity&quot;/> </id> <property name=&quot;Nom&quot; column=&quot;nom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> <property name=&quot;Prenom&quot; column=&quot;prenom&quot; type=&quot;String&quot; not-null=&quot;true&quot; /> </class> </hibernate-mapping> La balise property est la façon la plus simple de mapper un champ de la base de données à un membre d'une classe
  • 55.
    Document Libre. www.allili.net Il y a trois façons de construire des requêtes avec Nhibernate : Requête SQL native : utiliser une requête directement dans le dialecte de la BDD sous jacente va engendrer une perte de portabilité. Il vaut mieux l’éviter. Requête HQL (Hibernate Query Languge) : Ressemble beaucoup à du SQL. Manipule directement des objets au lieu de tables Ces Requêtes sont indépendantes des SGBD. Requêtes Criteria : Ces requêtes sont construites avec les Factory. Ils sont orientées objets, et indépendantes des SGBD. 05/06/09
  • 56.
    Document Libre. www.allili.net Requêtes SQL native : Le résultat une IList qui contient les éléments conformes aux critères. 05/06/09 Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); IList listepres = session.CreateSQLQuery(&quot;select * from personne&quot;, &quot;Personne&quot;, typeof(Personne)).List(); foreach (Personne pers in listepers) Console.WriteLine(pers.Id+” “+pers.Nom+” “+pers.Prenom); session.Close(); factory.Close();
  • 57.
    Document Libre. www.allili.net Requêtes HQL : Le résultat une IList qui contient les éléments conformes aux critères. 05/06/09 Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); IList listepers = session.CreateQuery(&quot;from Personne&quot;).List(); foreach (Personne pers in listepers) Console.WriteLine(pers.Id+” “+pers.Nom+” “+pers.Prenom); session.Close(); factory.Close();
  • 58.
    Document Libre. www.allili.net Requêtes Criteria : Le résultat est un ICriteria qui contient comme attributs une liste des éléments conformes aux critères. 05/06/09 Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); ICriteria c = session.CreateCriteria(typeof(Personne)) . Add(Expression.Eq(“Nom&quot;, “root@khalid&quot;)); foreach (Personne pers in c.List() ) Console.WriteLine(pers.Id+” “+pers.Nom+” “+pers.Prenom); session.Close(); factory.Close();
  • 59.
    Document Libre. www.allili.net La méthode load de ISession : Si on connaît l’identifiant, on peu utiliser la méthode load de l’instance ISession. Le résultat est une instance de la classe persistante. 05/06/09 Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); Console.Write(&quot;Entrer le id : &quot;); int id = Convert.ToInt32(Console.ReadLine()); Personne pers = new Personne(); session.Load(pers, id); Console.WriteLine(pers.Nom+ &quot; &quot; + pers.Prenom); session.Close(); factory.Close();
  • 60.
    Document Libre. www.allili.net 05/06/09 Insertion : Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); ITransaction tr = session.BeginTransaction(); Console.Write(&quot;Entrer le id : &quot;); int id = Convert.ToInt32(Console.ReadLine()); Console.Write(&quot;Entrer le nom : &quot;); String nom=Console.ReadLine(); Personne pers = new Personne(id, nom); session.save(pers, id); tr.commit(); session.Close(); factory.Close();
  • 61.
    Document Libre. www.allili.net 05/06/09 Modification : Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); ITransaction tr = session.BeginTransaction(); Console.Write(&quot;Entrer le id à modifier: &quot;); int id = Convert.ToInt32(Console.ReadLine()); Console.Write(&quot;Entrer le nouveau nom : &quot;); String nom=Console.ReadLine(); Personne pers = new Personne(id, nom); session.save(pers); tr.commit(); session.Close(); factory.Close();
  • 62.
    Document Libre. 05/06/09Suppression : Configuration cfg = new Configuration(); cfg.AddAssembly(“Mon_Assembly&quot;); ISessionFactory factory = cfg.BuildSessionFactory(); session = factory.OpenSession(); ITransaction tr = session.BeginTransaction(); Console.Write(&quot;Entrer le id à supprimer : &quot;); int id = Convert.ToInt32(Console.ReadLine()); Console.Write(&quot;Entrer le nom : &quot;); String nom=Console.ReadLine(); Personne pers = new Personne(id, nom); session.delete(pers); tr.commit(); session.Close(); factory.Close();
  • 63.
    Document Libre. www.allili.net Démos : Mapping_Personne 05/06/09
  • 64.