Introduction à NHibernate
La mise en place de NHibernate
La mise en place de NHibernate se fait en plusieurs étapes :
- Création du fichier de configuration.
- Le mapping des objets
- La session et la transaction NHibernate
Le fichier de configuration
Le fichier de configuration regroupe l’ensemble des informations de la base de données :
- Le type de la base de données : à l'aide de la propriété connection.driver_class.
- Le type de langage SQL à générer pour dialoguer avec la base de données : dialect.
- La chaine de connexion à la base de données : connection.connection_string.
Voici un exemple d'un fichier de configuration, que l'on nommera App.config
<configuration> <configSections> <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> </configSections> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <property name="connection.provider"> NHibernate.Connection.DriverConnectionProvider </property> <property name="connection.driver_class"> NHibernate.Driver.MySqlDataDriver </property> <property name="connection.connection_string"> Database=nhibernate;Data Source=127.0.0.1;User Id=root;Password= </property> <property name="dialect"> NHibernate.Dialect.MySQLDialect </property> <property name="proxyfactory.factory_class"> NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle </property> <property name="show_sql">true</property> </session-factory> </hibernate-configuration> </configuration>
Le mapping
Le mapping fait l’association entre un objet et une table de la base de données. Les attributs d'une classe représenteront un champ de la table. Le mapping se fait en plusieurs étapes :
- Création de la classe de l’objet : [Objet].cs
- Création du fichier de mapping : [Objet].hbm.xml
Les noms des fichiers sont des normes à respecter qui sont propre à NHibernate. Voici un exemple basique de mapping :
- Parking.cs :
public class Parking { private int id; private string name; //Constrcuteur …. public virtual int Id { get { return id; } set { id = value; } } public virtual string Name { get { return name; } set { name = value; } } }
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="Test.Parking, Test" table="parking“ > <id name="Id" column="id" type="Int32"> <generator class="native" /> </id> <property name="Name" column="parkingName" type="String"/> </class> </hibernate-mapping>
La balise generator permet de spécifier le type de generation de l'id de l'objet Parking. Dans notre cas, on demande que ce soit la base de données qui gére cet id.
Gestion des sessions et des transactions
- Gestion des sessions:
Pour gérer les sessions NHibernate, voici ce que l'on doit faire :
- On récupère la configuration de la base de données (fichier App.config) :
Configuration conf = new Configuration().Configure("App.config").AddAssembly("[objet].hbm.xml");
La méthode AddAssembly("[objet].hbm.xml") permet de rajouter le mapping de l'objet précédemment effectué. - On récupère la factory des sessions à l'aide de l'objet Configuration :
ISessionFactory factory = conf. BuildSessionFactory();
- On récupère une session de la factory :
ISession session = factory.OpenSession();
Avec cet objet Session, nous aurons trois actions possibles : Save (sauvegarder), Update (mettre à jour), Delete (supprimer). On l'utilisera de la façon suivante : session.Save(objet). Un exemple est à disposition.
- On récupère la configuration de la base de données (fichier App.config) :
- Que permet une transaction?
- Valider une action de la session : Commit();
- Annuler une action de la session : Rollback();
try{ ISession session = … ITransaction tx = session.BeginTransaction(); … tx.Commit(); session.Close(); } catch(Exception ex){ tx.Rollback(); }