2016-06-28 6 views
0

Ich lerne JPA-Beziehungen (@OneToOne, @ManyToOne, ...) und während ich mit Leuten darüber spreche, wie sie ihre Entitäten modellieren, desto verwirrter werde ich. Hier ist ein Beispiel von gestern:JPA und wie man über Beziehungen denkt

Nehmen wir an, wir haben eine Beziehung zwischen einem Person und einem Address. Der DB speichert den Address.id als FK in der Person s Tabelle als "address_id". Ist diese Beziehung OneToOne oder OneToMany? Ich habe gehört, dass Leute für jeden argumentieren, und beide haben gute Gründe, warum sie sich so fühlen.

Eine individuelle argumentiert, dass es „ein ManyToOne seit dem address_id ist für jeden Datensatz nicht eindeutig. Das gleiche address_id immer und immer wieder in den Person s Tabelle werden konnte. Er argumentiert, dass wirklich eine OneToOne haben, die FK in der Person s Tabelle müsste eindeutig sein, wie in der JSR-Spezifikation ".

andere einzelne Staaten, dass „wenn Sie eine Person Aufzeichnung darüber nachdenken, werden sie mehr als ein Address Wenn nicht, dann OneToOne es ist, warum kompliziert die Sache“

Ich bin verwirrt, was wahr ist. Auf der einen Seite war die erste Person in der Lage, die JSR-Spezifikation aufzubringen und mich darüber zu sprechen. Auf der anderen Seite habe ich einen Entwickler mit über 20 Jahren Erfahrung (und ist sehr respektiert), der mir sagt, dass ich es einfach halten soll.

Kann jemand bitte helfen diese

Vielen Dank für mich zu klären!

Antwort

1

Ich nehme etwa die Zuordnung von Person zu Adresse.

Eine bestimmte Person kann nicht mehr als eine Adresse haben, da die zugehörige Tabelle eine Fremdschlüsselspalte zur Adresse enthält.

So kann es ein OneToOne oder ein ManyToOne sein.

Es liegt an Ihnen zu entscheiden, welche es ist, und die Wahl hängt nicht von etwas Technisches ab. Wenn Sie nicht möchten, dass zwei verschiedene Personen die gleiche Adresse teilen, dann ist es ein OneToOne. Wenn Sie entscheiden, dass zwei Personen die gleiche Adresse teilen können, dann ist es ein ManyToOne.

Wenn es ein OneToOne ist, sollten Sie sicherstellen, dass es tatsächlich ein OneToOne ist, und dass zwei Personen nicht die gleiche Adresse teilen können. Die effektivste und einfachste Methode ist das Hinzufügen einer eindeutigen Integritätsbedingung der Spalte address_id der Personentabelle. Aber Hibernate ist es egal, ob Sie diese Einschränkung setzen oder nicht.

Ihre "andere Person" ist falsch. Wenn zwei Personen dieselbe Adresse teilen können, sollte es ein ManyToOne sein. Kein OneToOne. Stellen Sie sich vor, Sie machen es zu einer bidirektionalen Assoziation: Da eine Adresse von mehreren Personen gemeinsam genutzt werden kann, hätten Sie eine OneToMany-Verknüpfung zwischen Adresse und Person, was die Umkehrung der Assoziation zwischen Person und Adresse wäre. Und eine umgekehrte Zuordnung von OneToMany muss ein ManyToOne sein, kein OneToOne.

0

Wir haben Person und Adresse. Wir müssen die Beziehung zwischen ihnen identifizieren. Man könnte die Beziehung auf zwei verschiedene Arten, wie unten

  1. Von Person sehen
  2. Von-Adresse Adresse zu Person

1.From Person

Unter Beachtung der Adresse eine Address-Instanz oder Zeile aus Ihrer Tabelle und fragen Sie sich, ob diese bestimmte Adresszeile in einer Beziehung mit mehreren Personen stehen darf. Wenn ja, ist die Personenseite Viele, wenn keine Personenseite eine Person ist. So in diesem Stadium haben Sie identifiziert, ob Person ist viele oder One

Jetzt holen Sie eine Person Instanz oder Zeile von Ihrem Tisch und fragen Sie sich kann diese bestimmte Person mehr als eine Adresse haben. Wenn ja Adresse der Beziehung ist Viele andere Adressenseite ist Eins.

Ihr Beispiel

Person hat einen Fremdschlüssel, die Verweise auf ID-Adressen

Auf der Grundlage dieser Informationen Lets brainstorming

eine Person kann mehr als eine zugehörige Adresse hat? ?? Jede Person in der Personentabelle hat einen Fremdschlüssel (address_id), der auf die Adresszeile verweist. Da address_id nicht mehrwertig ist, können wir sagen, dass eine Person nur eine Adresse haben kann. So Adresse Seite der Beziehung ist eine

Kann eine Adresse mehr als einer Person gehören ??

Wie wir wissen, hat Person address_id, die Fremdschlüssel zu Adresse ist. Und es gibt keine Einschränkung, die angibt, dass address_id eindeutig ist. Das ist address_id Spalte kann den gleichen Wert für mehrere Zeilen in Person Tabelle haben. Daher können wir sagen, dass mehrere Personen die gleiche Adresse haben können. So Person Seite der Beziehung VIELE ist

Endlich schließen wir, dass Beziehung von Mensch-zu-Adresse many-to-ONE

Hinweis ist: - wenn der Fremdschlüssel address_id persönlich Tabelle einen eindeutigen hat Zwang angewendet, in diesem Fall wird mehrere Person nicht in der Lage sein, sich auf dieselbe Adresse zu beziehen, wodurch die Personseite der Beziehung EINS wird. Somit wäre die Beziehung One-to-One geworden

0

Einige DB hat keine direkten Optionen, um Eins-zu-eins-Beziehungen zu setzen. Sie können erzwingen, unique constraint wie @JB Nizet zu verwenden oder Person.id als Primärschlüssel für Adress-Tabelle und auch einen Fremdschlüssel für Personentabelle zu verwenden.

Wenn Sie dies nicht tun, können Sie nicht sicherstellen, dass eine Beziehung 1: 1 oder 1: n ist, ohne die Datenwerte zu kennen, mit denen Sie arbeiten.

Verwandte Themen