Eine ManyToOne
Beziehung 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
- Beispiel für eine ManyToOne-Beziehung annotationsEdit
- Beispiel für eine ManyToOne Beziehung XMLEdit
- Siehe auchEdit
- Gängige ProblemeBearbeiten
- Der Fremdschlüssel ist auch Teil des Primärschlüssels.Bearbeiten
- Constraint-Fehler beim Einfügen.Bearbeiten
- Der Wert des Fremdschlüssels ist nullBearbeiten Sie
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. 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.