Comment mapper des classes dans NHibernate en utilisant des rôles ou des compositions

Je crois que c’est une question / un problème courant, mais je n’ai pas été en mesure de trouver une réponse claire et concise.

Le problème

Comment mapper des entités qui semblent avoir une relation d’inheritance:

Company Supplier Manufacturer Customer 

Cependant, un fournisseur peut être un fabricant.

ou

 Person Doctor Patient Employee 

Où un patient peut être un médecin ou un employé.

Suggestion: utiliser des rôles

Lors des discussions sur les forums NHibernate, on répond souvent qu’il s’agit d’un inheritance multiple.

http://forum.hibernate.org/viewtopic.php?t=959076

Leur solution suggérée consiste à utiliser une composition ou à utiliser des “rôles”. Cependant, je ne trouve aucun exemple ni aucune explication sur la manière de procéder.

“Privilégiez la composition à l’inheritance.” Tu te souviens de ce petit cadeau de la classe? Dans ce cas, je suis d’accord pour dire que vous essayez l’inheritance multiple – pas possible en C # ou en Java (pour le moment). Personnellement, je vous encourage à réfléchir à la modification du modèle afin que vous ayez un object Personne et qu’une personne possède une collection de rôles un à plusieurs.

Vous voudrez probablement envisager d’utiliser les rôles. Donc, un rôle aura un ensemble de personnes. Ou une personne aura un ensemble de rôles ou les deux. Cela impliquerait probablement qu’il existe une classe d’association qui associe des personnes à des rôles.

Définissez une classe de personnes avec toutes les propriétés communes aux personnes. Définissez ensuite une super classe de rôles et des sous-classes DoctorRole, PatientRole et EmployeeRole (en supposant que chaque rôle a des propriétés différentes).

La classe Personne peut avoir un ensemble de rôles défini et la classe Rôle peut avoir un ensemble de personnes. Ou il pourrait être plus facile de créer une classe Association, appelons-la PeopleRole.

Cette page explique comment effectuer le mappage afin que PeopleRole soit un élément composite. Regardez l’exemple Order / Product / LineItem. Votre personne est comme Ordre, PeopleRole est comme LineItem et le rôle est comme Produit.

Il me semble qu’il s’agit plus d’une question de savoir comment bien modéliser un domaine que d’un problème de cartographie NHibernate.

Une fois que vous avez défini votre modélisation de domaine, vous constaterez que la cartographie NHibernate se déroule relativement facilement.

Un des endroits où vous pouvez vous faire une idée de la modélisation des rôles est de rechercher la ” modélisation des couleurs ” – Jeff de Luca dispose de quelques ressources , bien que l’idée vienne de Peter Coad.

L’idée de base est de séparer l’identité d’un participant du rôle qu’il joue dans une activité.

Par exemple, vous pouvez avoir un object Personne qui capture l’identité d’une personne en particulier.

Ensuite, un object complètement séparé “Student” qui capture les informations supplémentaires pour enregistrer l’inscription d’une personne en tant qu’étudiant. Chaque instance de Student aurait une référence à la personne inscrite. Une seule personne peut être liée à de nombreux enregistrements “Étudiant”, un pour chaque inscription distincte.

En parallèle, vous pouvez avoir un object “Tuteur” distinct qui enregistre les détails de l’emploi lorsqu’une personne est embauchée pour enseigner aux élèves dans des situations en tête-à-tête. L’object Tuteur capture les détails supplémentaires sur la manière dont une personne est employée en tant que tuteur.

Cette structure vous offre une grande flexibilité: une personne (Joe Bloggs) peut être simplement un étudiant, une autre personne (Jane Doe) peut être simplement un tuteur et une troisième (Chuck Norris) peut être les deux.

De plus, l’introduction d’un autre rôle (conférencier, marqueur, administrateur) devient plus facile car les ajouts ne nécessitent aucune modification des objects existants.

Je suis tombé sur un peu plus de commentaires que vous pourriez trouver pertinents:

Dans un article de blog sur le blog Naked Objects, nous décrivons différentes approches en discutant des avantages et des inconvénients de chacune.

  • Utilisation d’un mappage d’association ‘Any’
  • Modélisation des rôles en tant que classes