En ManyToOne
-relation i Java er en relation, hvor kildeobjektet har en attribut, der refererer til et andet objekt, målobjektet. Dvs. det ret typiske Java-tilfælde, at et objekt har en reference til et andet objekt. En ManyToOne
-relation kan angives unidirektionel. Det er dog typisk, at målobjektet har den omvendte relation specificeret tilbage til kildeobjektet. Dette ville være en OneToMany
-relationsspecifikation i målobjektet. Alle relationer i Java og JPA er ensrettede, dvs. at hvis et kildeobjekt refererer til et målobjekt, er der ingen garanti for, at målobjektet også har en relation til kildeobjektet. Dette er anderledes end i en relationel database, hvor relationer defineres via fremmednøgler og forespørgsler, således at den omvendte forespørgsel altid eksisterer.
I JPA specificeres en ManyToOne
-relation via @ManyToOne
-annotationen eller <many-to-one>
-elementet. En @ManyToOne
-annotation er typisk ledsaget af en @JoinColumn
-annotation. @JoinColumn
-annotationen angiver, hvordan relationen skal mappes til (udtrykkes i) databasen. @JoinColumn
definerer navnet på den fremmednøglespalte (@JoinColumn(name = "...")
) i kildeobjektet, som skal bruges til at finde (sammenføje) målobjektet.
Hvis den omvendte OneToMany
-relation er specificeret i målobjektet, skal @OneToMany
-annotationen i målobjektet indeholde en mappedBy
-attribut for at definere denne omvendte relation.
JPA definerer også en OneToOne
-relation, som svarer til en ManyToOne
-relation, bortset fra at den omvendte relation (hvis den var defineret) er en OneToOne
-relation. Hovedforskellen mellem en OneToOne
– og en ManyToOne
-relation i JPA er, at en ManyToOne
-relation altid indeholder en fremmed nøgle fra kildeobjektets tabel til målobjektets tabel, hvorimod fremmednøglen i en OneToOne
-relation enten kan være i kildeobjektets tabel eller i målobjektets tabel.
- Eksempel på en ManyToOne-relation databaseBearbejd
- Eksempel på et ManyToOne-forhold annotationerEdit
- Eksempel på et ManyToOne-forhold relation XMLEdit
- Se ogsåRediger
- Almindelige problemerRediger
- Fremmednøglen er også en del af den primære nøgle.Rediger
- Fremmednøglen er også tilknyttet som en grundnøgle.Rediger
- Begrænsningsfejl ved indsættelse.Rediger
- Foreign key value is nullRediger
Eksempel på en ManyToOne-relation databaseBearbejd
EMPLOYEE (tabel)
EMP_ID | FIRSTNAME | LASTNAME | SALÆR | MANAGER_ID |
1 | Bob | Way | 50000 | 2 |
2 | Sarah | Smith | 75000 | null |
PHONE (tabel)
ID | TYPE | AREA_CODE | P_NUMBER | OWNER_ID |
1 | home | 613 | 792-0000 | 1 |
2 | arbejde | 613 | 896-1234 | 1 |
3 | arbejde | 416 | 123-444444 | 2 |
Eksempel på et ManyToOne-forhold annotationerEdit
@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; ...
Eksempel på et ManyToOne-forhold relation 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>
Se ogsåRediger
- Relationer
- Kaskadering
- Lazy Fetching
- Mål Entitet
- Få fat i Fetching
- Batch Reading
- Fælles problemer
- OneToOne
- Mapping a OneToOne ved hjælp af en Join-tabel
- OneToMany
Almindelige problemerRediger
Fremmednøglen er også en del af den primære nøgle.Rediger
Se Primærnøgler gennem OneToOne-relationer.
Fremmednøglen er også tilknyttet som en grundnøgle.Rediger
Hvis du bruger det samme felt i to forskellige tilknytninger, skal du typisk gøre den ene af dem skrivebeskyttet ved hjælp af insertable, updatable = false
. Se Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys.
Begrænsningsfejl ved indsættelse.Rediger
Dette opstår typisk, fordi du har kortlagt den fremmede nøgle forkert i et OneToOne
-forhold.Se Målfremmede nøgler, Primærnøgleforbundne kolonner, Kaskadeprimære nøgler. Det kan også forekomme, hvis din JPA-provider ikke understøtter referentiel integritet eller ikke løser bi-directional constraints. I dette tilfælde kan du enten være nødt til at fjerne begrænsningen eller bruge EntityManager
flush()
for at sikre den rækkefølge, dine objekter skrives i.
Foreign key value is nullRediger
Sørg for at indstille værdien af objektets OneToOne
, hvis OneToOne
er en del af et tovejs OneToMany
forhold, skal du sørge for at indstille objektets OneToOne
, når du tilføjer et objekt til OneToMany
, JPA vedligeholder ikke tovejsforhold for dig. Kontroller også, at du har defineret JoinColumn
korrekt, sørg for, at du ikke har indstillet insertable, updateable = false
eller brugt en PrimaryKeyJoinColumn
.