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.