jeudi 24 juillet 2025

NHibernate



🔷 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

NHibernate Lượt xem: