
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
- Példa egy ManyToOne kapcsolatra annotationsEdit
- Példa egy ManyToOne kapcsolatra. kapcsolat XMLEdit
- Lásd mégEdit
- Common ProblemsEdit
- Az idegen kulcs is része az elsődleges kulcsnak.Szerkesztés
- Az idegen kulcsot alapként is leképezik.Szerkesztés
- Constraint error on insert.Edit
- Foreign key value is nullEdit
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.