Java Persistence/ManyToOne

author
3 minutes, 33 seconds Read

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

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.

Similar Posts

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.