2008-10-22 5 views
6

Je crois qu'il s'agit d'une question/d'un problème commun, mais que je n'ai pas réussi à trouver une bonne réponse propre et concise.Comment mapper des classes dans NHibernate en utilisant les rôles ou la composition

Le problème

Comment cartographier les entités qui semblent avoir une relation d'héritage:

Company 
    Supplier 
    Manufacturer 
    Customer 

Cependant, un fournisseur peut être un fabricant.

ou

Person 
    Doctor 
    Patient 
    Employee 

Lorsqu'un patient peut être un médecin ou peut être un employé.

Suggestion: Utiliser les rôles

Au cours des discussions sur les forums NHibernate, la réponse est souvent que cela est l'héritage multiple.

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

Ils solution proposée est d'utiliser la composition ou d'utiliser des "rôles". Cependant, je ne peux trouver aucun exemple ou explication sur la façon exacte de faire cela.

"Favoriser la composition sur l'héritage." Rappelez-vous ce petit goodie de classe? Dans ce cas, je dois d'accord que vous essayez plusieurs héritage - pas possible en C# ou Java (encore). Moi, personnellement, vous encourager à penser à re-modélisation de sorte que vous avez un objet Personne et une personne a un un-à-plusieurs collection de rôles.

Répondre

4

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 Association qui associe des personnes à des rôles.

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

La classe Person peut avoir une collection de rôles définie et la classe Role peut avoir une collection de personnes définie. Ou il peut être plus facile de créer une classe Association, appelons-la PeopleRole.

This La page explique comment effectuer le mappage pour que PeopleRole soit un élément composite. Regardez l'exemple Order/Product/LineItem. Votre personne est comme Order, PeopleRole est comme LineItem et Role est comme un produit.

+0

La pièce que je ne comprirent pas été le DoctorRole, PatientRole, etc sous-classes! Le lien est utile aussi! Merci – quip

+0

Le lien ne fonctionne plus. Attention à mettre à jour? – TedOnTheNet

+0

@TedOnTheNet Merci pour les heads up. Je vais devoir chercher le nouvel emplacement de cette page. –

3

Il me semble que c'est plus une question de modélisation d'un domaine que d'un problème de mappage NHibernate. Une fois que vous avez trié votre modélisation de domaine, je pense que vous trouverez que le mappage de NHibernate tombe relativement facilement.

Un endroit pour chercher à obtenir votre tête autour de l'idée de la modélisation des rôles est de rechercher « Color Modeling » - Jeff de Luca a some resources, bien que l'idée est née avec Peter Coad

L'idée de base est de séparer l'identité d'un participant du rôle qu'ils jouent dans une activité. Par exemple, vous pouvez avoir un objet Personne qui capture l'identité d'une personne en particulier. Puis, un objet complètement "étudiant" 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 «Etudiants», un pour chaque inscription distincte.

En parallèle, vous pourriez avoir un objet «Tutor» distinct qui enregistre les détails de l'emploi lorsque quelqu'un est embauché pour enseigner aux élèves dans des situations individuelles. L'objet Tutor capture les détails supplémentaires sur la façon dont quelqu'un est employé en tant que tuteur.

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

En outre, l'introduction d'un autre rôle (Maître de conférence, Marqueur, Administrateur) devient plus facile car les ajouts ne nécessitent pas de modification des objets existants.

+0

Merci pour votre réponse. Cela m'a aidé à comprendre du point de vue de la modélisation. Vous avez raison, il s'agit plus d'une question de modélisation de domaine que spécifique à NHibernate. – quip

1

je suis tombé sur un peu plus des commentaires que vous trouverez peut-être pertinente:

Dans un blog post on the Naked Objects blog quelques approches différentes sont décrites discuter les avantages et les inconvénients de chacun.

  • L'utilisation d'un 'tout' mapping d'association
  • rôles de modélisation en tant que classes
+0

Cet article semble prometteur. Je n'ai pas eu le temps de le lire en profondeur, mais semble être une bonne trouvaille. – quip

Questions connexes