Java Persistence/ManyToOne

author
3 minutes, 31 seconds Read

Eine ManyToOneBeziehung in Java ist, wenn das Quellobjekt ein Attribut hat, das auf ein anderes Objekt, das Zielobjekt, verweist. D.h. der eher typische Java-Fall, dass ein Objekt einen Verweis auf ein anderes Objekt hält. Eine ManyToOne-Beziehung kann unidirektional angegeben werden. Es ist jedoch typisch, dass für das Zielobjekt die umgekehrte Beziehung zum Quellobjekt angegeben wird. Dies wäre eine OneToMany-Beziehungsspezifikation im Zielobjekt. Alle Beziehungen in Java und JPA sind unidirektional, d.h. wenn ein Quellobjekt auf ein Zielobjekt verweist, gibt es keine Garantie, dass das Zielobjekt auch eine Beziehung zum Quellobjekt hat. Dies ist ein Unterschied zu einer relationalen Datenbank, in der Beziehungen durch Fremdschlüssel und Abfragen definiert werden, so dass die umgekehrte Abfrage immer existiert.

In JPA wird eine ManyToOne-Beziehung durch die @ManyToOne-Annotation oder das <many-to-one>-Element spezifiziert. Eine @ManyToOne-Annotation wird normalerweise von einer @JoinColumn-Annotation begleitet. Die @JoinColumn-Anmerkung gibt an, wie die Beziehung in der Datenbank abgebildet (ausgedrückt) werden soll. Die @JoinColumn definiert den Namen der Fremdschlüsselspalte (@JoinColumn(name = "...")) im Quellobjekt, die verwendet werden soll, um das Zielobjekt zu finden (zu verknüpfen).

Wenn die umgekehrte OneToMany-Beziehung im Zielobjekt angegeben ist, dann muss die @OneToMany-Anmerkung im Zielobjekt ein mappedBy-Attribut enthalten, um diese umgekehrte Beziehung zu definieren.

JPA definiert auch eine OneToOne-Beziehung, die einer ManyToOne-Beziehung ähnelt, mit dem Unterschied, dass die inverse Beziehung (wenn sie definiert wurde) eine OneToOne-Beziehung ist. Der Hauptunterschied zwischen einer OneToOne– und einer ManyToOne-Beziehung in JPA besteht darin, dass eine ManyToOne-Beziehung immer einen Fremdschlüssel von der Tabelle des Quellobjekts zur Tabelle des Zielobjekts enthält, während bei einer OneToOne-Beziehung der Fremdschlüssel entweder in der Tabelle des Quellobjekts oder der Tabelle des Zielobjekts liegen kann.

Beispiel für eine ManyToOne-Beziehung databaseEdit

EMPLOYEE (Tabelle)

EMP_ID FIRSTNAME LETZTERNAME Gehalt MANAGER_ID
1 Bob Weg 50000 2
2 Sarah Smith 75000 null

PHONE (Tabelle)

ID TYPE AREA_CODE P_NUMBER OWNER_ID
1 home 613 792-0000 1
2 Arbeit 613 896-1234 1
3 Arbeit 416 123-4444 2

Beispiel für eine ManyToOne-Beziehung annotationsEdit

@Entitypublic class Phone { @Id private long id; ... // Specifies the PHONE table does not contain an owner column, but // an OWNER_ID column with a foreign key. And creates a join to // lazily fetch the owner @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="OWNER_ID") private Employee owner; ...}// Specification of the reverse OneToMany relationship in Employee@Entitypublic class Employee { @Id private long emp_id; ... // The 'mappedBy = "owner"' attribute specifies that // the 'private Employee owner;' field in Phone owns the // relationship (i.e. contains the foreign key for the query to // find all phones for an employee.) @OneToMany(mappedBy = "owner") private List<Phone> phones; ...

Beispiel für eine ManyToOne Beziehung XMLEdit

<entity name="Phone" class="org.acme.Phone" access="FIELD"> <attributes> <id name="id"/> <many-to-one name="owner" fetch="LAZY"> <join-column name="OWNER_ID"/> </many-to-one> </attributes></entity>

Siehe auchEdit

  • Beziehungen
    • Kaskadierung
    • Lazy Fetching
    • Zielentität
    • Join Fetching
    • Batch Reading
    • Gängige Probleme
  • OneToOne
    • Mapping einer OneToOne mit einer Join-Tabelle
  • OneToMany

Gängige ProblemeBearbeiten

Der Fremdschlüssel ist auch Teil des Primärschlüssels.Bearbeiten

Siehe Primärschlüssel durch OneToOne-Beziehungen. Wenn Sie dasselbe Feld in zwei verschiedenen Zuordnungen verwenden, müssen Sie normalerweise eines davon mit insertable, updatable = false schreibgeschützt machen. Siehe Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys.

Constraint-Fehler beim Einfügen.Bearbeiten

Dies tritt typischerweise auf, weil Sie den Fremdschlüssel in einer OneToOne-Beziehung falsch zugeordnet haben, siehe Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys. Es kann auch auftreten, wenn Ihr JPA-Provider keine referentielle Integrität unterstützt oder bidirektionale Beschränkungen nicht auflöst. In diesem Fall müssen Sie entweder die Einschränkung entfernen oder EntityManager flush() verwenden, um sicherzustellen, dass Ihre Objekte in dieser Reihenfolge geschrieben werden.

Der Wert des Fremdschlüssels ist nullBearbeiten Sie

Stellen Sie sicher, dass Sie den Wert der OneToOne des Objekts festlegen. Wenn die OneToOne Teil einer bidirektionalen OneToMany-Beziehung ist, stellen Sie sicher, dass Sie die OneToOne des Objekts festlegen, wenn Sie ein Objekt zur OneToMany hinzufügen, da JPA keine bidirektionalen Beziehungen für Sie pflegt. Vergewissern Sie sich auch, dass Sie JoinColumn korrekt definiert haben, stellen Sie sicher, dass Sie nicht insertable, updateable = false gesetzt oder ein PrimaryKeyJoinColumn verwendet haben.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.