Java Persistence/ManyToOne

author
3 minutes, 44 seconds Read

En ManyToOne-relation i Java innebär att källobjektet har ett attribut som refererar till ett annat objekt, målobjektet. Dvs. det ganska typiska Java-fallet att ett objekt har en referens till ett annat objekt. En ManyToOne-relation kan specificeras enkelriktat. Det är dock typiskt att målobjektet har den omvända relationen specificerad tillbaka till källobjektet. Detta skulle vara en OneToMany-relationsspecifikation i målobjektet. Alla relationer i Java och JPA är enkelriktade, dvs. om ett källobjekt refererar till ett målobjekt finns det ingen garanti för att målobjektet också har en relation till källobjektet. Detta skiljer sig från en relationsdatabas, där relationer definieras genom främmande nycklar och genom att ställa frågor så att den omvända frågan alltid existerar.

I JPA specificeras en ManyToOne-relation genom @ManyToOne-annotationen eller <many-to-one>-elementet. En @ManyToOne-annotation åtföljs vanligtvis av en @JoinColumn-annotation. Annotationen @JoinColumn anger hur relationen ska mappas till (uttryckas i) databasen. @JoinColumn definierar namnet på den främmande nyckelkolumn (@JoinColumn(name = "...")) i källobjektet som ska användas för att hitta (ansluta) målobjektet.

Om den omvända OneToMany-relationen specificeras i målobjektet måste @OneToMany-annotationen i målobjektet innehålla ett mappedBy-attribut för att definiera denna omvända relation.

JPA definierar också en OneToOne-relation, som liknar en ManyToOne-relation, förutom att den omvända relationen (om den definieras) är en OneToOne-relation. Den största skillnaden mellan en OneToOne– och en ManyToOne-relation i JPA är att en ManyToOne-relation alltid innehåller en främmande nyckel från källobjektets tabell till målobjektets tabell, medan den främmande nyckeln i en OneToOne-relation antingen kan finnas i källobjektets tabell eller i målobjektets tabell.

Exempel på en ManyToOne-relation databaseEdit

EMPLOYEE (tabell)

EMP_ID FIRSTNAME LASTNAME SALARY MANAGER_ID
1 Bob Way 50000 2
2 Sarah Smith 75000 null

PHONE (table)

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

Exempel på en ManyToOne-relation 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; ...

Exempel på en ManyToOne-relation 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>

See AlsoEdit

  • Relationships
    • Cascading
    • Lazy Fetching
    • Målenhet
    • Tillhörande hämtning
    • Batchläsning
    • Högsta problem
  • En till en
    • Mappning av en OneToOne using a Join table
  • OneToMany

Vanliga problemRedigera

Den främmande nyckeln är också en del av den primära nyckeln.Redigera

Se Primärnycklar genom OneToOne-relationer.

Främlingsnyckeln mappas också som en grundläggande.Redigera

Om du använder samma fält i två olika mappningar måste du vanligtvis göra en av dem skrivskyddad med hjälp av insertable, updatable = false. Se Målfrämmande nycklar, Kolumner för sammanfogning av primärnycklar, Kaskadprimärnycklar.

Fel i begränsning vid insättning.Redigera

Detta inträffar vanligtvis eftersom du har mappat den främmande nyckeln felaktigt i ett OneToOne-förhållande.Se Målfrämmande nycklar, Primärnyckelns sammanfogade kolumner, Kaskadprimärnycklar. Det kan också inträffa om din JPA-provider inte har stöd för referentiell integritet eller inte löser dubbelriktade begränsningar. I det här fallet kan du antingen behöva ta bort begränsningen eller använda EntityManager flush() för att säkerställa den ordning som dina objekt skrivs i.

Foreign key value is nullEdit

Se till att du ställer in värdet på objektets OneToOne, om OneToOne är en del av en dubbelriktad OneToMany-relation, se till att du ställer in objektets OneToOne när du lägger till ett objekt till OneToMany, JPA upprätthåller inte dubbelriktade relationer åt dig. Kontrollera också att du har definierat JoinColumn korrekt, se till att du inte har satt insertable, updateable = false eller använt en PrimaryKeyJoinColumn.

Similar Posts

Lämna ett svar

Din e-postadress kommer inte publiceras.