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
- Exempel på en ManyToOne-relation annotationsEdit
- Exempel på en ManyToOne-relation relation XMLEdit
- See AlsoEdit
- Vanliga problemRedigera
- Den främmande nyckeln är också en del av den primära nyckeln.Redigera
- Främlingsnyckeln mappas också som en grundläggande.Redigera
- Fel i begränsning vid insättning.Redigera
- Foreign key value is nullEdit
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
.