Java Persistence/ManyToOne

author
4 minutes, 16 seconds Read

A ManyToOne kapcsolat Java-ban az, amikor a forrásobjektumnak van egy attribútuma, amely egy másik objektumra, a célobjektumra hivatkozik. Vagyis az a meglehetősen tipikus Java eset, hogy az egyik objektum hivatkozást tart egy másik objektumra. A ManyToOne kapcsolat egyirányúan is megadható. Jellemző azonban, hogy a célobjektumnak a forrásobjektumra visszamenőleg a fordított kapcsolat van megadva. Ez egy OneToMany kapcsolat specifikációja lenne a célobjektumban. A Java és a JPA minden kapcsolata egyirányú, azaz ha egy forrásobjektum hivatkozik egy célobjektumra, akkor nincs garancia arra, hogy a célobjektumnak is van kapcsolata a forrásobjektummal. Ez eltér a relációs adatbázistól, ahol a kapcsolatok idegen kulcsokon és lekérdezésen keresztül vannak definiálva úgy, hogy a fordított lekérdezés mindig létezik.

A JPA-ban egy ManyToOne kapcsolat a @ManyToOne annotáción vagy a <many-to-one> elemen keresztül van megadva. A @ManyToOne annotációt jellemzően egy @JoinColumn annotáció kíséri. A @JoinColumn annotáció meghatározza, hogy a kapcsolatot hogyan kell leképezni (kifejezni) az adatbázisban. A @JoinColumn meghatározza annak az idegen kulcs oszlopnak a nevét (@JoinColumn(name = "...")) a forrásobjektumban, amelyet a célobjektum megtalálásához (összekapcsolásához) kell használni.

Ha a fordított OneToMany kapcsolat van megadva a célobjektumban, akkor a @OneToMany annotációnak a célobjektumban tartalmaznia kell egy mappedBy attribútumot, amely meghatározza ezt a fordított kapcsolatot.

A JPA definiál egy OneToOne kapcsolatot is, amely hasonló a ManyToOne kapcsolathoz, azzal a különbséggel, hogy az inverz kapcsolat (ha definiálva lenne) egy OneToOne kapcsolat. A fő különbség a OneToOne és a ManyToOne kapcsolat között a JPA-ban az, hogy a ManyToOne kapcsolat mindig tartalmaz egy idegen kulcsot a forrásobjektum táblájából a célobjektum táblájába, míg a OneToOne kapcsolatnál az idegen kulcs lehet akár a forrásobjektum táblájában, akár a célobjektum táblájában.

Példa egy ManyToOne kapcsolatra databaseEdit

EMPLOYEE (tábla)

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

PHONE (táblázat)

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

Példa egy ManyToOne kapcsolatra 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; ...

Példa egy ManyToOne kapcsolatra. kapcsolat 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>

Lásd mégEdit

  • Kapcsolatok
    • Cascading
    • Lazy Fetching
    • Cél entitás
    • Join Fetching
    • Batch Reading
    • Common Problems
  • OneToOne
    • Mapping a OneToOne Using a Join Table
  • OneToMany

Common ProblemsEdit

Az idegen kulcs is része az elsődleges kulcsnak.Szerkesztés

Lásd: Elsődleges kulcsok a OneToOne kapcsolatokon keresztül.

Az idegen kulcsot alapként is leképezik.Szerkesztés

Ha ugyanazt a mezőt két különböző leképezésben használja, akkor az egyiket általában csak olvashatóvá kell tenni a insertable, updatable = false használatával. Lásd Cél idegen kulcsok, Elsődleges kulcsok egyesítése oszlopok, Kaszkád elsődleges kulcsok.

Constraint error on insert.Edit

Ez jellemzően azért fordul elő, mert az idegen kulcsot helytelenül képezte le egy OneToOne kapcsolatban.Lásd: Target Foreign Keys, Primary Key Join Columns, Cascade Primary Keys. Akkor is előfordulhat, ha a JPA szolgáltató nem támogatja a referenciális integritást, vagy nem oldja fel a kétirányú korlátozásokat. Ebben az esetben vagy el kell távolítania a korlátozást, vagy EntityManager flush() használatával biztosítania kell az objektumok írási sorrendjét.

Foreign key value is nullEdit

Biztosítsa az objektum OneToOne értékének beállítását, ha a OneToOne egy kétirányú OneToMany kapcsolat része, biztosítsa az objektum OneToOne értékének beállítását, amikor objektumot ad hozzá a OneToMany-hez, a JPA nem tart fenn kétirányú kapcsolatokat az Ön számára. Ellenőrizze azt is, hogy helyesen definiálta-e a JoinColumn-t, győződjön meg arról, hogy nem állította be a insertable, updateable = false-et, vagy nem használt PrimaryKeyJoinColumn-et.

Similar Posts

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.