Ok, donc c'est probablement une question triviale mais j'ai du mal à visualiser et à comprendre les différences et quand les utiliser. Je ne sais pas non plus comment des concepts tels que les mappages unidirectionnels et bidirectionnels affectent les relations un-à-plusieurs / plusieurs-à-plusieurs. J'utilise Hibernate en ce moment, donc toute explication liée à l'ORM sera utile.
À 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
}
Alors, 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 avoir un aperçu du moment où utiliser un à plusieurs et plusieurs à plusieurs et quand utiliser une table de jointure par rapport à une colonne de jointure et unidirectionnel par rapport à bidirectionnel.
la source
Réponses:
Un-à-plusieurs : une personne a plusieurs compétences, une compétence n'est pas réutilisée entre les personnes
Plusieurs à plusieurs : une personne a plusieurs compétences, une compétence est réutilisée entre les personnes
Dans une relation un-à-plusieurs, un objet est le "parent" et un autre est "l'enfant". Le parent contrôle l'existence de l'enfant. Dans un Many-To-Many, l'existence de l'un ou l'autre type dépend de quelque chose en dehors des deux (dans le contexte d'application plus large).
Votre sujet (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 d'ingénierie qui échange la mémoire, le traitement, les performances , etc.
Ce qui peut prêter à confusion, 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 la compétence n'a pas besoin de se rapporter uniquement à ces personnes. C'est généralement 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")!
Tous ces éléments sont bien pris en charge par Hibernate et JPA. Rappelez-vous simplement qu'Hibernate ou tout autre ORM ne se soucie pas du maintien de la symétrie lors de la gestion des relations plusieurs-à-plusieurs bidirectionnelles ... tout dépend de l'application.
la source
On dirait que tout le monde répond
One-to-many
vsMany-to-many
.:La différence entre
One-to-many
,Many-to-one
etMany-to-Many
est:One-to-many
vsMany-to-one
est une question de perspective .Unidirectional
vsBidirectional
n'affectera pas le mappage mais fera la différence sur la façon dont vous pouvez accéder à vos données.Many-to-one
lemany
côté gardera la référence duone
côté. Un bon exemple est «Un État a des villes». Dans ce cas,State
c'est le côté unique etCity
le côté multiple. Il y aura une colonnestate_id
dans le tableaucities
.One-to-Many
un côté sera notre point de référence. Par exemple, "Un utilisateur a une adresse". Dans ce cas, nous pourrions avoir trois colonnesaddress_1_id
,address_2_id
et /address_3_id
ou une table de recherche avec une contrainte unique suruser_id
etaddress_id
.Many-to-Many
membres de chaque parti peuvent tenir référence à un nombre arbitraire de membres de l'autre parti. Pour ce faire, une table de consultation est utilisée. La relation entre les médecins et les patients en est un exemple. Un médecin peut avoir de nombreux patients et vice versa.la source
s.persons
, car il n'y a ques.person
One-to-many
relation que vous décrivez est uneMany-to-many
relation car elleperson
fait référence à beaucoupskills
maisskill
ne garde pas la référence à une personne en particulier et beaucouppersons
peuvent avoir une référence identiqueskill
. Et votreMany-to-one
relation est en faitOne-to-many
parce que chaque compétence ne fait référence qu'à une seuleperson
car un enfant n'a qu'une seule mère.skills
aperson_id
), alors vous l'appelez un-à-plusieurs, mais quand c'est du côté "Plusieurs" (utilisateurs et adresses,users
aaddress_id
), vous l'appelez plusieurs-à-un. Mais structurellement, les deux cas sont identiques et appelés un-à-plusieurs.1) Les cercles sont Entités / POJO / Haricots
2) deg est une abréviation de degré comme dans les graphiques (nombre d'arêtes)
PK = clé primaire, FK = clé étrangère
Notez la contradiction entre le diplôme et le nom du côté. Beaucoup correspond à degré = 1 tandis que Un correspond à degré> 1.
la source
Jetez un œil à cet article: Mappage des relations d'objets
la source
this occurs when the maximum of one multiplicity is one and the other is greater than one
lolwut?Un à plusieurs
La relation de table un à plusieurs se présente comme suit:
Dans un système de base de données relationnelle, une relation de table un-à-plusieurs lie deux tables sur la base d'un
Foreign Key
colonne de l'enfant qui fait référence à la lignePrimary Key
de la table parent.Dans le diagramme de tableau ci-dessus, la
post_id
colonne dupost_comment
tableau a uneForeign Key
relation avec la colonne d'post
ID de tablePrimary Key
:Annotation @ManyToOne
La meilleure façon de mapper la relation de table un à plusieurs consiste à utiliser
@ManyToOne
annotation.Dans notre cas, l'entité enfant
PostComment
mappe lapost_id
colonne de clé étrangère à l'aide de l'@ManyToOne
annotation:Utilisation du JPA
@OneToMany
annotationCe
@OneToMany
n'est pas parce que vous avez la possibilité d'utiliser l' annotation que cela doit être l'option par défaut pour chaque un-à-plusieurs relation de base données . Le problème avec les collections est que nous ne pouvons les utiliser que lorsque le nombre d'enregistrements enfants est plutôt limité.La meilleure façon de mapper une
@OneToMany
association est de s'appuyer sur le@ManyToOne
côté pour propager tous les changements d'état d'entité:L'entité parente,,
Post
présente deux méthodes utilitaires (par exempleaddComment
etremoveComment
) qui sont utilisées pour synchroniser les deux côtés de l'association bidirectionnelle. Vous devez toujours fournir ces méthodes chaque fois que vous travaillez avec une association bidirectionnelle car, sinon, vous risquez des problèmes de propagation d'état très subtils .L'
@OneToMany
association unidirectionnelle est à éviter car elle est moins efficace que l'utilisation@ManyToOne
ou l'@OneToMany
association bidirectionnelle .Un par un
La relation de table un-à-un se présente comme suit:
Dans un système de base de données relationnelle, une relation de table un-à-un lie deux tables en fonction d'une
Primary Key
colonne de l'enfant qui fait égalementForeign Key
référence à la lignePrimary Key
de la table parent.Par conséquent, nous pouvons dire que la table enfant partage le
Primary Key
avec la table parent.Dans le diagramme ci-dessus, la
id
colonne dupost_details
tableau a également uneForeign Key
relation avec la colonne dupost
tableauid
Primary Key
:Utilisation de JPA
@OneToOne
avec des@MapsId
annotationsLa meilleure façon de cartographier une
@OneToOne
relation est d'utiliser@MapsId
. De cette façon, vous n'avez même pas besoin d'une association bidirectionnelle puisque vous pouvez toujours récupérer l'PostDetails
entité en utilisant l'Post
identifiant d'entité.Le mappage ressemble à ceci:
[code language = "java"] @Entity (name = "PostDetails") @Table (name = "post_details") classe publique PostDetails {
} [/ code]
De cette façon, la
id
propriété sert à la fois de clé primaire et de clé étrangère. Vous remarquerez que la@Id
colonne n'utilise plus d'@GeneratedValue
annotation puisque l'identifiant est rempli avec l'identifiant de l'post
association.Plusieurs à plusieurs
La relation de table plusieurs à plusieurs se présente comme suit:
Dans un système de base de données relationnelle, une relation de table plusieurs à plusieurs lie deux tables parentes via une table enfant qui contient deux
Foreign Key
colonnes référençant lesPrimary Key
colonnes des deux tables parentes.Dans le diagramme de tableau ci-dessus, la
post_id
colonne dupost_tag
tableau a également uneForeign Key
relation avec la colonne d'post
id de tablePrimary Key
:Et, la
tag_id
colonne de lapost_tag
table a uneForeign Key
relation avec la colonne d'tag
ID de tablePrimary Key
:Utilisation du
@ManyToMany
mappage JPAVoici comment mapper la
many-to-many
relation de table avec JPA et Hibernate:tags
association dans l'Post
entité définit uniquement les typesPERSIST
etMERGE
cascade. Comme expliqué dans cet article , laREMOVE
transition d'état d'entité n'a aucun sens pour une@ManyToMany
association JPA car elle pourrait déclencher une suppression de chaîne qui effacerait finalement les deux côtés de l'association.Post
entité utilise l'identificateur d'entité pour l'égalité car elle ne dispose d'aucune clé métier unique. Comme expliqué dans cet article , vous pouvez utiliser l'identificateur d'entité pour l'égalité tant que vous vous assurez qu'il reste cohérent dans toutes les transitions d'état d'entité .Tag
entité possède une clé métier unique marquée de l'@NaturalId
annotation spécifique à Hibernate . Dans ce cas, la clé métier unique est le meilleur candidat pour les contrôles d'égalité .mappedBy
attribut de l'posts
association dans l'Tag
entité marque que, dans cette relation bidirectionnelle, l'Post
entité est propriétaire de l'association. Cela est nécessaire car un seul côté peut posséder une relation et les modifications ne sont propagées à la base de données que de ce côté particulier.Set
est préférable d'utiliser unList
avec@ManyToMany
est moins efficace.la source
cela exigerait probablement une relation plusieurs-à-plusieurs comme suit
vous devrez peut-être définir un joinTable + JoinColumn mais cela fonctionnera aussi sans ...
la source
J'expliquerais de cette façon:
OneToOne - Relation OneToOne
OneToMany - Relation ManyToOne
ManyToMany - ManyToMany relation
la source
Tout d'abord, lisez tous les petits caractères. Notez que le mappage relationnel NHibernate (donc, je suppose, Hibernate également) a une correspondance amusante avec le mappage de DB et de graphes d'objets. Par exemple, les relations un à un sont souvent implémentées comme une relation plusieurs à un.
Deuxièmement, avant que nous puissions vous dire comment vous devez écrire votre carte O / R, nous devons également voir votre base de données. En particulier, une seule compétence peut-elle être possédée par plusieurs personnes? Si tel 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:
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 Skills.) Cependant, certains préféreront utiliser la relation plusieurs-à-plusieurs (entre Person et Skill); c'est controversé.
Quatrièmement, si vous avez des relations bidirectionnelles (par exemple, non seulement Person a une collection de Compétences, mais aussi, Skill a une collection de Personnes), NHibernate n'applique pas la bidirectionnalité dans votre BL pour vous; il ne comprend la bidirectionnalité des relations qu'à des fins de persistance.
Cinquièmement, plusieurs-à-un est beaucoup plus facile à utiliser correctement dans NHibernate (et je suppose Hibernate) que un-à-plusieurs (mappage de collection).
Bonne chance!
la source