Ok, das ist wahrscheinlich eine triviale Frage, aber ich habe Probleme, die Unterschiede zu visualisieren und zu verstehen und wann ich sie verwenden soll. Ich bin mir auch ein wenig unklar, wie sich Konzepte wie unidirektionale und bidirektionale Zuordnungen auf die Eins-zu-Viele / Viele-zu-Viele-Beziehungen auswirken. Ich verwende gerade den Ruhezustand, daher ist jede Erklärung, die sich auf ORM bezieht, hilfreich.
Nehmen wir als Beispiel an, ich habe das folgende Setup:
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
}
Welche Art von Zuordnung hätte ich in diesem Fall? Antworten auf dieses spezielle Beispiel sind auf jeden Fall willkommen, aber ich möchte auch einen Überblick darüber, wann entweder eins zu viele und viele zu viele verwendet werden sollen und wann eine Verknüpfungstabelle gegenüber einer Verknüpfungsspalte und unidirektional gegenüber bidirektional verwendet werden soll.
quelle
Antworten:
Eins-zu-viele : Eine Person hat viele Fähigkeiten, eine Fähigkeit wird zwischen Personen nicht wiederverwendet.
Viele-zu-Viele : Eine Person hat viele Fähigkeiten, eine Fähigkeit wird zwischen Personen wiederverwendet.
In einer Eins-zu-Viele-Beziehung ist ein Objekt das "Elternteil" und eines das "Kind". Der Elternteil kontrolliert die Existenz des Kindes. In einem Many-To-Many hängt die Existenz eines der beiden Typen von etwas außerhalb der beiden ab (im größeren Anwendungskontext).
Ihr Thema (Domäne) sollte bestimmen, ob die Beziehung Eins-zu-Viele oder Viele-zu-Viele ist oder nicht. Ich finde jedoch, dass es eine technische Entscheidung ist, die Beziehung unidirektional oder bidirektional zu machen, die Speicher, Verarbeitung und Leistung beeinträchtigt , etc.
Was verwirrend sein kann, ist, dass eine bidirektionale Viele-zu-Viele-Beziehung nicht symmetrisch sein muss! Das heißt, eine Gruppe von Menschen könnte auf eine Fertigkeit hinweisen, aber die Fertigkeit muss sich nicht nur auf diese Personen beziehen. Typischerweise würde es, aber eine solche Symmetrie ist keine Voraussetzung. Nehmen wir zum Beispiel die Liebe - sie ist bidirektional ("Ich-Liebe", "Liebt-mich"), aber oft asymmetrisch ("Ich liebe sie, aber sie liebt mich nicht")!
All dies wird von Hibernate und JPA gut unterstützt. Denken Sie daran, dass der Ruhezustand oder ein anderes ORM keine Rolle bei der Aufrechterhaltung der Symmetrie spielt, wenn bidirektionale Viele-zu-Viele-Beziehungen verwaltet werden. Das hängt alles von der Anwendung ab.
quelle
Sieht aus wie jeder antwortet
One-to-many
vs.Many-to-many
:Der Unterschied zwischen
One-to-many
,Many-to-one
undMany-to-Many
ist:One-to-many
vsMany-to-one
ist eine Frage der Perspektive .Unidirectional
vsBidirectional
hat keinen Einfluss auf die Zuordnung, macht jedoch einen Unterschied darin, wie Sie auf Ihre Daten zugreifen können.Many-to-one
dermany
Seite wird die Referenz derone
Seite behalten . Ein gutes Beispiel ist "Ein Staat hat Städte". In diesem FallState
ist die eine Seite undCity
ist die viele Seite.state_id
In der Tabelle wird eine Spalte angezeigtcities
.One-to-Many
der einen Seite wird unser Bezugspunkt sein. Zum Beispiel "Ein Benutzer hat eine Adresse". In diesem Fall könnten wir drei Spalten habenaddress_1_id
,address_2_id
undaddress_3_id
oder eine Nachschlagtabelle mit UNIQUE - Einschränkung aufuser_id
undaddress_id
.Many-to-Many
Mitgliedern jeder Partei kann auf eine beliebige Anzahl von Mitgliedern der anderen Partei Bezug genommen werden. Um dies zu erreichen, wird eine Nachschlagetabelle verwendet. Ein Beispiel dafür ist die Beziehung zwischen Ärzten und Patienten. Ein Arzt kann viele Patienten haben und umgekehrt.quelle
s.persons
, da es nur gibts.person
One-to-many
Beziehung, wie Sie sie beschreiben, eineMany-to-many
Beziehung, da sieperson
sich auf viele beziehtskills
, sichskill
jedoch nicht auf eine bestimmte Person bezieht und vielepersons
eine gleiche Referenz haben könnenskill
. Und IhreMany-to-one
Beziehung besteht tatsächlich darin,One-to-many
dass jede Fähigkeit nur einen Bezug hat,person
da ein Kind nur eine Mutter hat.skills
hatperson_id
), dann nennt man es Eins-zu-Viele, aber wenn es eine ist, die "Viele" Seite (Benutzer und Adressen,users
hataddress_id
), dann nennt man es Viele-zu-Eins. Aber strukturell sind beide Fälle identisch und werden Eins-zu-Viele genannt.1) Die Kreise sind Entities / POJOs / Beans
2) Grad ist eine Abkürzung für Grad wie in Diagrammen (Anzahl der Kanten)
PK = Primärschlüssel, FK = Fremdschlüssel
Beachten Sie den Widerspruch zwischen dem Grad und dem Namen der Seite. Viele entsprechen Grad = 1, während Eins Grad> 1 entspricht.
quelle
Schauen Sie sich diesen Artikel an: Zuordnen von Objektbeziehungen
quelle
this occurs when the maximum of one multiplicity is one and the other is greater than one
lol was?Eins zu viele
Die Eins-zu-Viele-Tabellenbeziehung sieht wie folgt aus:
In einem relationalen Datenbanksystem verknüpft eine Eins-zu-Viele-Tabellenbeziehung zwei Tabellen basierend auf einer
Foreign Key
Spalte im untergeordneten Element, diePrimary Key
auf die der übergeordneten Tabellenzeile verweist .Im obigen Tabellendiagramm hat die
post_id
Spalte in derpost_comment
Tabelle eineForeign Key
Beziehung zur Spalte mit derpost
Tabellen-IDPrimary Key
:@ManyToOne Annotation
Der beste Weg, um die Eins-zu-Viele-Tabellenbeziehung abzubilden, ist die Verwendung der
@ManyToOne
Anmerkung.In unserem Fall
PostComment
ordnet diepost_id
untergeordnete Entität die Spalte@ManyToOne
Fremdschlüssel mithilfe der Anmerkung zu:Verwenden der JPA-
@OneToMany
AnnotationNur weil Sie die Option haben, die
@OneToMany
Anmerkung zu verwenden, bedeutet dies nicht, dass dies die Standardoption für jede Eins-zu-Viele- Datenbankbeziehung sein sollte. Das Problem bei Sammlungen ist, dass wir sie nur verwenden können, wenn die Anzahl der untergeordneten Datensätze eher begrenzt ist.Der beste Weg, eine
@OneToMany
Zuordnung zuzuordnen , besteht darin, sich auf die@ManyToOne
Seite zu verlassen, um alle Änderungen des Entitätsstatus zu verbreiten:Die übergeordnete Entität verfügt
Post
über zwei Dienstprogrammmethoden (z. B.addComment
undremoveComment
), mit denen beide Seiten der bidirektionalen Zuordnung synchronisiert werden. Sie sollten diese Methoden immer bereitstellen, wenn Sie mit einer bidirektionalen Zuordnung arbeiten, da Sie sonst sehr subtile Probleme bei der Zustandsausbreitung riskieren .Die unidirektionale
@OneToMany
Zuordnung ist zu vermeiden, da sie weniger effizient ist als die Verwendung@ManyToOne
oder die bidirektionale@OneToMany
Zuordnung.Eins zu eins
Die Eins-zu-Eins-Tabellenbeziehung sieht wie folgt aus:
In einem relationalen Datenbanksystem verknüpft eine Eins-zu-Eins-Tabellenbeziehung zwei Tabellen basierend auf einer
Primary Key
Spalte im untergeordnetenForeign Key
Element, die auchPrimary Key
auf die übergeordnete Tabellenzeile verweist .Daher können wir sagen, dass die untergeordnete Tabelle die
Primary Key
mit der übergeordneten Tabelle teilt .Im obigen Tabellendiagramm hat die
id
Spalte in derpost_details
Tabelle auch eineForeign Key
Beziehung zurpost
Tabellenspalteid
Primary Key
:Verwenden der JPA
@OneToOne
mit@MapsId
AnmerkungenDer beste Weg, eine
@OneToOne
Beziehung abzubilden, ist die Verwendung@MapsId
. Auf diese Weise benötigen Sie nicht einmal eine bidirektionale Zuordnung, da Sie diePostDetails
Entität jederzeit mithilfe derPost
Entitätskennung abrufen können.Das Mapping sieht folgendermaßen aus:
[code language = "java"] @Entity (name = "PostDetails") @Table (name = "post_details") öffentliche Klasse PostDetails {
} [/ code]
Auf diese Weise
id
dient die Eigenschaft sowohl als Primärschlüssel als auch als Fremdschlüssel. Sie werden feststellen, dass in der@Id
Spalte keine@GeneratedValue
Anmerkung mehr verwendet wird, da der Bezeichner mit dem Bezeichner derpost
Zuordnung gefüllt ist .Viel zu viel
Die Viele-zu-Viele-Tabellenbeziehung sieht wie folgt aus:
In einem relationalen Datenbanksystem verknüpft eine Viele-zu-Viele-Tabellenbeziehung zwei übergeordnete Tabellen über eine untergeordnete Tabelle, die zwei
Foreign Key
Spalten enthält , die auf diePrimary Key
Spalten der beiden übergeordneten Tabellen verweisen .Im obigen Tabellendiagramm hat die
post_id
Spalte in derpost_tag
Tabelle auch eineForeign Key
Beziehung zurpost
Tabellen-ID-Primary Key
Spalte:Die
tag_id
Spalte in derpost_tag
Tabelle hat eineForeign Key
Beziehung zur Spalte mit dertag
Tabellen-IDPrimary Key
:Verwenden der JPA-
@ManyToMany
ZuordnungSo können Sie die
many-to-many
Tabellenbeziehung mit JPA und Hibernate zuordnen:tags
Zuordnung in derPost
Entität definiert nur die TypenPERSIST
undMERGE
Kaskadentypen. Wie in diesem Artikel erläutert , ist derREMOVE
Entitätsstatusübergang für eine@ManyToMany
JPA-Zuordnung nicht sinnvoll, da er eine Kettenlöschung auslösen könnte, die letztendlich beide Seiten der Zuordnung löschen würde.Post
Entität verwendet die Entitätskennung für die Gleichheit, da ihr ein eindeutiger Geschäftsschlüssel fehlt. Wie in diesem Artikel erläutert , können Sie die Entitätskennung für die Gleichheit verwenden, solange Sie sicherstellen, dass sie über alle Entitätsstatusübergänge hinweg konsistent bleibt .Tag
Entität verfügt über einen eindeutigen Geschäftsschlüssel, der mit der@NaturalId
Annotation für den Ruhezustand gekennzeichnet ist . In diesem Fall ist der eindeutige Geschäftsschlüssel der beste Kandidat für Gleichstellungsprüfungen .mappedBy
Attribut derposts
Zuordnung in derTag
Entität kennzeichnet, dass in dieser bidirektionalen Beziehung diePost
Entität die Zuordnung besitzt. Dies ist erforderlich, da nur eine Seite eine Beziehung besitzen kann und Änderungen nur von dieser bestimmten Seite an die Datenbank weitergegeben werden.Set
ist zu bevorzugen, da die Verwendung einesList
with@ManyToMany
weniger effizient ist.quelle
Dies würde wahrscheinlich ein Viele-zu-Viele-Beziehungsschiff wie folgt erfordern
Möglicherweise müssen Sie eine joinTable + JoinColumn definieren, aber es funktioniert auch ohne ...
quelle
Ich würde das so erklären:
OneToOne - OneToOne- Beziehung
OneToMany - ManyToOne- Beziehung
ManyToMany - ManyToMany- Beziehung
quelle
Lesen Sie zunächst das Kleingedruckte. Beachten Sie, dass die relationale Zuordnung von NHibernate (also vermutlich auch von Hibernate) eine lustige Entsprechung zur Zuordnung von DB und Objektgraphen aufweist. Beispielsweise werden Eins-zu-Eins-Beziehungen häufig als Viele-zu-Eins-Beziehung implementiert.
Zweitens müssen wir auch Ihre Datenbank sehen, bevor wir Ihnen sagen können, wie Sie Ihre O / R-Karte schreiben sollen. Kann eine einzelne Fähigkeit insbesondere von mehreren Personen besessen werden? Wenn ja, haben Sie eine Viele-zu-Viele-Beziehung; Ansonsten ist es viele zu eins.
Drittens ziehe ich es vor, nicht viele-zu-viele-Beziehungen direkt zu implementieren, sondern stattdessen die "Join-Tabelle" in Ihrem Domänenmodell zu modellieren - dh sie als eine Entität wie folgt zu behandeln:
Dann siehst du was du hast? Sie haben zwei Eins-zu-Viele-Beziehungen. (In diesem Fall verfügt die Person möglicherweise über eine Sammlung von PersonSkills, jedoch nicht über eine Sammlung von Skills.) Einige bevorzugen jedoch die Verwendung einer Viele-zu-Viele-Beziehung (zwischen Person und Fähigkeit). das ist umstritten.
Viertens, wenn Sie bidirektionale Beziehungen zu tun haben (zB nicht nur , dass Person , die eine Sammlung von Fähigkeiten, sondern auch, Fähigkeit hat eine Sammlung von Personen), ist NHibernate nicht Bidirektionalität in Ihrem BL für Sie erzwingen; Es versteht nur die Bidirektionalität der Beziehungen für Persistenzzwecke.
Fünftens ist Many-to-One in NHibernate (und ich gehe von Hibernate aus) viel einfacher korrekt zu verwenden als One-to-Many (Sammlungszuordnung).
Viel Glück!
quelle