O relație ManyToOne
în Java este aceea în care obiectul sursă are un atribut care face referire la un alt obiect, obiectul țintă. Adică, cazul destul de tipic Java în care un obiect deține o referință la un alt obiect. O relație ManyToOne
poate fi specificată unidirecțional. Cu toate acestea, este tipic ca obiectul țintă să aibă specificată relația inversă cu obiectul sursă. Aceasta ar fi o specificație de relație OneToMany
în obiectul țintă. Toate relațiile din Java și JPA sunt unidirecționale, în sensul că, dacă un obiect sursă face referire la un obiect țintă, nu există nicio garanție că obiectul țintă are, de asemenea, o relație cu obiectul sursă. Acest lucru este diferit de o bază de date relațională, în care relațiile sunt definite prin chei străine și interogări astfel încât interogarea inversă să existe întotdeauna.
În JPA o relație ManyToOne
este specificată prin intermediul adnotării @ManyToOne
sau al elementului <many-to-one>
. O adnotare @ManyToOne
este de obicei însoțită de o adnotare @JoinColumn
. Adnotarea @JoinColumn
specifică modul în care relația trebuie mapată (exprimată în) baza de date. @JoinColumn
definește numele coloanei de cheie externă (@JoinColumn(name = "...")
) din obiectul sursă care ar trebui să fie utilizată pentru a găsi (alătura) obiectul țintă.
Dacă relația inversă OneToMany
este specificată în obiectul țintă, atunci adnotarea @OneToMany
din obiectul țintă trebuie să conțină un atribut mappedBy
pentru a defini această relație inversă.
JPA definește, de asemenea, o relație OneToOne
, care este similară unei relații ManyToOne
, cu excepția faptului că relația inversă (în cazul în care a fost definită) este o relație OneToOne
. Principala diferență între o relație OneToOne
și o relație ManyToOne
în JPA este că o relație ManyToOne
conține întotdeauna o cheie străină din tabelul obiectului sursă în tabelul obiectului țintă, în timp ce într-o relație OneToOne
cheia străină poate fi fie în tabelul obiectului sursă, fie în tabelul obiectului țintă.
- Exemplu de relație ManyToOne databaseEdit
- Exemplu de relație ManyToOne adnotăriEdit
- Exemplu de relație ManyToOne relație XMLEdit
- Vezi șiEdit
- Probleme comuneEdit
- Cheia externă face parte și din cheia primară.Edit
- Cheia externă este, de asemenea, mapată ca o cheie de bază. editare
- Constraint error on insert.Edit
- Foreign key value is nullEdit
Exemplu de relație ManyToOne databaseEdit
EMPLOYEE (tabel)
EMP_ID | FIRSTNAME | LASTNAME | SALARY | 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 | lucru | 613 | 896-1234 | 1 |
3 | lucru | 416 | 123-4444 | 2 |
Exemplu de relație ManyToOne adnotăriEdit
@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; ...
Exemplu de relație ManyToOne relație 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>
Vezi șiEdit
- Relații
- Cascading
- Lazy Fetching
- Target Entity
- Join Fetching
- Batch Reading
- Common Problems
- OneToOne
- Mapping a OneToOne folosind o tabelă Join
- OneToMany
Probleme comuneEdit
Cheia externă face parte și din cheia primară.Edit
A se vedea Chei primare prin relații OneToOne.
Cheia externă este, de asemenea, mapată ca o cheie de bază. editare
Dacă utilizați același câmp în două mape diferite, de obicei este necesar să faceți ca unul dintre ele să fie doar de citire folosind insertable, updatable = false
. A se vedea Chei străine țintă, Coloane de îmbinare a cheilor primare, Chei primare în cascadă.
Constraint error on insert.Edit
Acest lucru apare de obicei pentru că ați mappat incorect cheia externă într-o relație OneToOne
. a se vedea Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys. Poate apărea, de asemenea, dacă furnizorul JPA nu acceptă integritatea referențială sau nu rezolvă constrângerile bidirecționale. În acest caz, este posibil să trebuiască fie să eliminați constrângerea, fie să utilizați EntityManager
flush()
pentru a asigura ordinea în care sunt scrise obiectele dumneavoastră.
Foreign key value is nullEdit
Asigurați-vă că ați stabilit valoarea OneToOne
a obiectului, dacă OneToOne
face parte dintr-o relație bidirecțională OneToMany
, asigurați-vă că ați stabilit OneToOne
a obiectului atunci când adăugați un obiect la OneToMany
, JPA nu menține relațiile bidirecționale pentru dumneavoastră. De asemenea, verificați dacă ați definit corect JoinColumn
, asigurați-vă că nu ați setat insertable, updateable = false
sau că nu ați utilizat un PrimaryKeyJoinColumn
.