Unterschied zwischen @JoinColumn und mappedBy

Unterschied zwischen @JoinColumn und mappedBy

1. Einführung

JPA-Beziehungen können entweder unidirektional oder bidirektional sein. Dies bedeutet einfach, dass wir sie als Attribut für genau eine der zugeordneten Entitäten oder für beide modellieren können.

Das Definieren der Richtung der Beziehung zwischen Entitäten hat keine Auswirkungen auf die Datenbankzuordnung. Es definiert nur die Richtungen, in denen wir diese Beziehung in unserem Domänenmodell verwenden.

Für eine bidirektionale Beziehung definieren wir normalerweise:

  • die besitzerseite

  • inverse oder die referenzierende Seite

Mithilfe der Annotation@JoinColumnkönnen wir die Spalte angeben, die zum Verbinden einer Entitätszuordnung oder Elementsammlung verwendet wird. Andererseits wird das AttributmappedBy verwendet, um die referenzierende Seite (nicht besitzende Seite) der Beziehung zu definieren.

In diesem kurzen Tutorial sehen wir unsthe difference between @JoinColumn and mappedByin JPA. We’ll also present how to use them in a one-to-many association. an

2. Ersteinrichtung

Nehmen wir an, wir haben zwei Entitäten:Employee undEmail.

Natürlich kann ein Mitarbeiter mehrere E-Mail-Adressen haben. Eine angegebene E-Mail-Adresse kann jedoch genau einem einzelnen Mitarbeiter gehören.

Das bedeutet, dass sie eine Eins-zu-Viele-Assoziation haben:

image

Auch in unserem RDBMS-Modell haben wir einen Fremdschlüsselemployee_id in unsererEmail-Entität, der auf dasid-Attribut einesEmployee verweist.

3. @JoinColumn Anmerkung

In einer Eins-zu-Viele / Viele-zu-Eins-Beziehungthe owning side is usually defined on the ‘many' side of the relationship. Normalerweise ist es die Seite, die den Fremdschlüssel besitzt.

Die Annotation@JoinColumndefiniert die tatsächliche physische Zuordnung auf der Besitzerseite:

@Entity
public class Email {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_id")
    private Employee employee;

    // ...

}

Dies bedeutet einfach, dass unsere EntitätEmaileine Fremdschlüsselspalte mit dem Namenemployee_id hat, die sich auf das primäre Attributid unserer EntitätEmployeebezieht.

4. mappedBy Attribut

Nachdem wir die Eigentümerseite der Beziehung definiert haben, verfügt Hibernate bereits über alle Informationen, die zur Zuordnung dieser Beziehung in unserer Datenbank erforderlich sind. Um diese Zuordnung bidirektional zu machen, müssen wir lediglich die Referenzierungsseite definieren. Die inverse oder die referenzierende Seite wird einfach der besitzenden Seite zugeordnet.

Wir können dazu leicht das AttributmappedBy der Annotation@OneToManyverwenden. Definieren wir also die EntitätEmployee:

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
    private List emails;

    // ...
}

Hierthe value of mappedBy is the name of the association-mapping attribute on the owning side. Damit haben wir nun eine bidirektionale Zuordnung zwischen unseren EntitätenEmployee undEmail hergestellt.

5. Fazit

In diesem Tutorial haben wir uns den Unterschied zwischen@JoinColumn undmappedBy angesehen und wie man sie in einer bidirektionalen Eins-zu-Viele-Beziehung verwendet.

Die Annotation@JoinColumndefiniert die tatsächliche physische Zuordnung auf der Besitzerseite. Andererseits wird die referenzierende Seite unter Verwendung des AttributsmappedByder Annotation@OneToManydefiniert.

Wie üblich ist der Quellcodeover on Github verfügbar.