Ok, donc c’est probablement une question triviale, mais j’ai du mal à visualiser et à comprendre les différences et à savoir quand les utiliser. Je ne comprends pas non plus clairement comment des concepts tels que les mappages unidirectionnels et bidirectionnels affectent les relations un à plusieurs/plusieurs à plusieurs. J'utilise Hibernate maintenant, donc toute explication liée à ORM sera utile.
A titre d'exemple, disons que j'ai la configuration suivante:
public class Person{
private Long personId;
private Set<Skill> skills;
//Getters and setters
}
public class Skill{
private Long skillId;
private String skillName;
//Getters and setters
}
Donc, dans ce cas, quel type de cartographie aurais-je? Les réponses à cet exemple spécifique sont certainement appréciées, mais j'aimerais aussi vraiment savoir quand utiliser un à plusieurs et plusieurs à plusieurs et quand utiliser une table de jointure par opposition à une colonne de jointure et unidirectionnel par rapport à bidirectionnel.
n-à-plusieurs: une personne a plusieurs compétences, une compétence n'est pas réutilisée entre personnes
Plusieurs à plusieurs: Une personne a plusieurs compétences, une compétence est réutilisée entre personnes.
Dans une relation un-à-plusieurs, un objet est le "parent" et l'autre, le "enfant". Le parent contrôle l'existence de l'enfant. Dans plusieurs-plusieurs, l'existence de l'un ou l'autre type dépend de quelque chose en dehors de l'un et l'autre (dans le contexte plus large de l'application).
Votre domaine (domaine) doit dicter si la relation est un-à-plusieurs ou plusieurs-à-plusieurs - cependant, je trouve que rendre la relation unidirectionnelle ou bidirectionnelle est une décision technique qui échange la mémoire, le traitement et les performances. , etc.
Ce qui peut être déroutant, c'est qu'une relation bidirectionnelle plusieurs à plusieurs n'a pas besoin d'être symétrique! Autrement dit, un groupe de personnes pourrait désigner une compétence, mais cette compétence ne doit pas nécessairement concerner uniquement ces personnes. En règle générale, ce serait le cas, mais une telle symétrie n'est pas une exigence. Prenez l'amour, par exemple, il est bidirectionnel ("I-Love", "Loves-Me"), mais souvent asymétrique ("Je l'aime, mais elle ne m'aime pas")!
Tout cela est bien supporté par Hibernate et JPA. N'oubliez pas que Hibernate ou tout autre ORM n'aiment pas garder la symétrie lors de la gestion de relations bidirectionnelles plusieurs-à-plusieurs ... cela dépend de l'application.
On dirait que tout le monde répond One-to-many
contre Many-to-many
:
La différence entre One-to-many
, Many-to-one
et Many-to-Many
est:
One-to-many
contre Many-to-one
est une question de perspective . Unidirectional
vs Bidirectional
n'affectera pas le mappage, mais changera la façon dont vous pouvez accéder à vos données.
One-to-many
_ le côté many
gardera la référence du côté one
. Un bon exemple est "Une personne a beaucoup de compétences". Dans ce cas, Person
est le côté unique et Skill
est le côté multiple. Il y aura une colonne person_id
dans la table skills
.Dans unidirectionnel
Person
la classe auraList<Skill> skills
maisSkill
n'aura pasPerson person
. Dans bidirectional les deux propriétés sont ajoutées et vous permettent d'accéder à unPerson
donné une compétence (c'est-à-direskill.person
).
Many-to-one
le côté multiple sera notre point de référence. Par exemple, "Un utilisateur a une adresse". Dans notre système, de nombreux utilisateurs peuvent partager une adresse (par exemple, un certain nombre de personnes peuvent partager le même numéro de bloc). Dans ce cas, le address_id
La colonne _ dans la table users
sera partagée par plus d'une rangée users
. Dans ce cas, on dit que users
et addresses
ont Many-to-one
relation.Dans unidirectionnel un
User
auraAddress address
. bidirectionnel aura unList<User> users
dans la classeAddress
.
Many-to-Many
Les membres de chaque partie peuvent faire référence à un nombre arbitraire de membres de l’autre partie. Pour ce faire, un table de consultation est utilisé. Exemple pour cela est la relation entre les médecins et les patients. Un médecin peut avoir beaucoup de patients et vice versa.1) Les cercles sont des entités/POJO/haricots
2) deg est une abréviation de degree comme dans les graphes (nombre d'arêtes)
PK = clé primaire, FK = clé étrangère
Notez la contradiction entre le degré et le nom du côté. Beaucoup correspond à degré = 1 tandis que One correspond à degré> 1.
Jetez un oeil à cet article: Mapping Object Relationships
Vous devez vous préoccuper de deux catégories de relations d’objet lors du mappage. La première catégorie est basée sur la multiplicité et comprend trois types:
*One-to-one relationships. This is a relationship where the maximums of each of its multiplicities is one, an example of which is holds relationship between Employee and Position in Figure 11. An employee holds one and only one position and a position may be held by one employee (some positions go unfilled).
*One-to-many relationships. Also known as a many-to-one relationship, this occurs when the maximum of one multiplicity is one and the other is greater than one. An example is the works in relationship between Employee and Division. An employee works in one division and any given division has one or more employees working in it.
*Many-to-many relationships. This is a relationship where the maximum of both multiplicities is greater than one, an example of which is the assigned relationship between Employee and Task. An employee is assigned one or more tasks and each task is assigned to zero or more employees.
La deuxième catégorie est basée sur la directionnalité et contient deux types, les relations unidirectionnelles et les relations bidirectionnelles.
*Uni-directional relationships. A uni-directional relationship when an object knows about the object(s) it is related to but the other object(s) do not know of the original object. An example of which is the holds relationship between Employee and Position in Figure 11, indicated by the line with an open arrowhead on it. Employee objects know about the position that they hold, but Position objects do not know which employee holds it (there was no requirement to do so). As you will soon see, uni-directional relationships are easier to implement than bi-directional relationships.
*Bi-directional relationships. A bi-directional relationship exists when the objects on both end of the relationship know of each other, an example of which is the works in relationship between Employee and Division. Employee objects know what division they work in and Division objects know what employees work in them.
cela nécessiterait probablement une relation plusieurs-à-plusieurs comme suit
public class Person{
private Long personId;
@manytomany
private Set skills;
//Getters and setters
}
public class Skill{
private Long skillId;
private String skillName;
@manyToMany(MappedBy="skills,targetClass="Person")
private Set persons; // (people would not be a good convenion)
//Getters and setters
}
vous devrez peut-être définir un joinTable + JoinColumn mais cela fonctionnera aussi sans ...
Tout d’abord, lisez tous les détails. Notez que NHibernate (et donc aussi Hibernate, je suppose), le mappage relationnel présente une correspondance amusante avec le mappage de la base de données et du graphe des objets. Par exemple, les relations un à un sont souvent implémentées en tant que relations plusieurs à un.
Deuxièmement, avant de pouvoir vous dire comment écrire votre carte O/R, nous devons également consulter votre base de données. En particulier, une compétence peut-elle être possédée par plusieurs personnes? Si c'est le cas, vous avez une relation plusieurs à plusieurs; sinon, c'est plusieurs-à-un.
Troisièmement, je préfère ne pas implémenter directement les relations plusieurs à plusieurs, mais plutôt modéliser la "table de jointure" dans votre modèle de domaine - c'est-à-dire la traiter comme une entité, comme ceci:
class PersonSkill
{
Person person;
Skill skill;
}
Alors voyez-vous ce que vous avez? Vous avez deux relations un à plusieurs. (Dans ce cas, Person peut avoir une collection de PersonSkills, mais pas une collection de Compétences.) Cependant, certains préféreront utiliser une relation plusieurs à plusieurs (entre Personne et Compétence); c'est controversé.
Quatrièmement, si vous avez des relations bidirectionnelles (par exemple, non seulement Person a-t-il une collection de compétences, mais également Skill a-t-il une collection de personnes), NHibernate ne fait pas appliquer la bidirectionalité à votre BL; il ne comprend la bidirectionalité des relations que pour des raisons de persistance.
Cinquièmement, il est beaucoup plus facile d’utiliser correctement plusieurs utilisateurs sur NHibernate (et je suppose Hibernate) que l’un-à-plusieurs (mappage de collection).
Bonne chance!