Java Persistență/ManyToOne

author
4 minutes, 4 seconds Read

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

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.

Similar Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată.