🔷 1. Présentation générale de NHibernate
NHibernate est un ORM (Object-Relational Mapper) pour .NET, basé sur Hibernate (Java). Il permet de mapper des classes C# sur des tables de base de données relationnelles, et de gérer automatiquement les interactions (CRUD) entre les objets et la base.
✅ Objectif principal : faciliter l'accès aux données sans écrire de SQL directement.
🔷 2. Mots-clés et concepts importants
| Terme | Description |
|---|---|
| SessionFactory | Point d’entrée de NHibernate, utilisé pour créer des sessions. |
| Session | Une unité de travail : permet de charger, enregistrer ou mettre à jour des entités. |
| Transaction | Permet de grouper plusieurs opérations dans une seule unité atomique. |
| Mapping | Association entre les classes C# et les tables de la base (via XML ou attributs). |
| HQL (Hibernate Query Language) | Langage de requête orienté objet, similaire à SQL mais basé sur les entités. |
| Lazy Loading | Chargement différé : l’objet est chargé uniquement quand on y accède. |
🔷 3. Principaux attributs NHibernate (Data Annotations)
Depuis NHibernate 3.x+, il est possible d'utiliser les attributs en C# (au lieu du fichier .hbm.xml).
Exemple de classe avec attributs :
[Class(Table = "Users")]
public class User
{
[Id(Name = "Id", Column = "id")]
[Generator(1, Class = "identity")]
public virtual int Id { get; set; }
[Property(Column = "username", Length = 50, NotNull = true)]
public virtual string Username { get; set; }
[Property(Column = "email")]
public virtual string Email { get; set; }
[OneToMany(1, ClassType = typeof(Post), Cascade = "all-delete-orphan", Inverse = true)]
public virtual IList<Post> Posts { get; set; }
}
Attributs courants :
| Attribut | Description |
|---|---|
[Class] |
Lie une classe à une table |
[Id] |
Spécifie la clé primaire |
[Generator] |
Définit la stratégie de génération (identity, sequence, assigned...) |
[Property] |
Mappe une propriété sur une colonne |
[OneToMany], [ManyToOne], [ManyToMany] |
Relations entre entités |
[Component] |
Objet embarqué sans identité propre |
🔷 4. Fetching (stratégies de chargement)
NHibernate offre plusieurs stratégies pour charger les entités associées :
⚙️ Types de fetching :
| Type | Description |
|---|---|
| Lazy (par défaut) | L'entité liée n’est chargée que lorsqu'on y accède. |
| Eager | L'entité liée est chargée en même temps que l'entité principale. |
| Join Fetch | Utilise une jointure SQL (JOIN) pour charger les données liées. |
Exemple :
var user = session.Get<User>(1); // Les "Posts" ne sont pas encore chargés (Lazy)
var userWithPosts = session.Query<User>()
.Fetch(u => u.Posts)
.FirstOrDefault(u => u.Id == 1); // Chargement avec Fetch
🔷 5. Défauts et inconvénients de NHibernate
| Problème | Description |
|---|---|
| Complexité initiale | Mise en place et configuration peuvent être lourdes |
| Performance avec Lazy | Mauvais usage peut entraîner le N+1 problem |
| Moins populaire aujourd’hui | Remplacé dans de nombreux projets par Entity Framework |
| Documentation dispersée | Moins centralisée que d'autres ORM |
🔷 6. Relations entre entités avec NHibernate
a) One-to-One
[OneToOne(Class = typeof(Profile), PropertyRef = "User")]
public virtual Profile Profile { get; set; }
b) One-to-Many
[OneToMany(ClassType = typeof(Post), Inverse = true, Cascade = "all")]
public virtual IList<Post> Posts { get; set; }
c) Many-to-One
[ManyToOne(ClassType = typeof(User), Column = "user_id")]
public virtual User User { get; set; }
d) Many-to-Many
[Bag(Table = "UserRoles", Cascade = "all")]
[Key(Column = "user_id")]
[ManyToMany(Column = "role_id", ClassType = typeof(Role))]
public virtual IList<Role> Roles { get; set; }
✅ Conclusion
NHibernate est un ORM mature et très puissant. Il offre un bon contrôle des mappings et une gestion fine du chargement des entités. Toutefois, il nécessite une bonne compréhension de ses mécanismes pour éviter les pièges de performance.
Aucun commentaire:
Enregistrer un commentaire