Ha bármilyen hibernate alkalmazáson dolgozunk, vagy a jövőben tervezünk dolgozni, akkor könnyen megérthetjük az alkalmazás több entitása közötti egy-egy kapcsolatokat. Ebben a hibernate egy-egy leképezési példában 4 különböző variációt fogunk tárgyalni.
Table of ContentsVarious supported techniques for one to one mapping1. Using foreign key association2. Using join table3. Using shared primary key4. @MapsId
Ezért a hibernate egy-egy leképezési példáért kiterjesztem a hibernate hello world példához írt példát. Itt két entitással rendelkezünk: Employee
és Account
.
Egy alkalmazottnak csak egy fiókja lehet. Hasonlóképpen, egy fiók csak egy alkalmazotthoz fog kapcsolódni. Ebben a példában ez egy-egy kapcsolat.
Változatos támogatott technikák
A hibernate-ben 3 módja van annak, hogy egy-egy kapcsolatot hozzunk létre két entitás között. Mindkét módon a @OneToOne annotációt kell használnunk.
- Az első technika a legelterjedtebb, és egy idegen kulcs oszlopot használ az egyik táblában.
- A második technika egy eléggé ismert megoldást használ, amikor egy harmadik tábla tárolja a leképezést az első két tábla között.
- A harmadik technika valami új, ami egy közös elsődleges kulcsértéket használ mindkét táblában.
Hibernate egy az egyhez leképezés idegen kulcs társítással
Egy ilyen típusú társításnál egy idegen kulcs oszlopot hozunk létre a tulajdonos entitásban. Például, ha az EmployeeEntity-t tulajdonosnak tesszük, akkor a Employee
táblában egy extra "ACCOUNT_ID"
oszlop jön létre. Ez az oszlop fogja tárolni a Account
tábla idegen kulcsát.
A tábla szerkezete a következő lesz:
Az ilyen társításhoz a Account
entitásra a EmployeeEntity
osztályban a következőképpen kell hivatkozni:
@OneToOne@JoinColumn(name="ACCOUNT_ID")private AccountEntity account;
A join oszlopot a @JoinColumn annotációval deklaráljuk, ami úgy néz ki, mint a @Column annotáció. Van még egy paramétere, amelynek a neve referencedColumnName
. Ez a paraméter deklarálja a megcélzott entitásban lévő oszlopot, amelyet a csatlakozáshoz használni fog.
Ha a tulajdonos oldalon nincs @JoinColumn
deklarálva, akkor az alapértelmezett értékek érvényesek. A tulajdonos táblában létrejön egy vagy több join oszlop(ok), amelynek neve a tulajdonos oldalon lévő kapcsolat nevének, a _ (aláhúzás) és a tulajdonosi oldalon lévő elsődleges kulcs oszlop(ok) nevének összevonása lesz.
A kétirányú kapcsolat esetén az egyik félnek (és csak az egyiknek) tulajdonosnak kell lennie. A tulajdonos felelős a társítási oszlop(ok) frissítéséért. Annak kijelentésére, hogy egy oldal nem felelős a kapcsolatért, a mappedBy attribútumot kell használni. A “mappedBy” a tulajdonos oldalon lévő asszociáció tulajdonságnevére utal.
@OneToOne(mappedBy="account")private EmployeeEntity employee;
A fenti "mappedBy
” attribútum kijelenti, hogy a leképezés a tulajdonos entitástól függ.
Teszteljük a fenti leképezéseket a futó kódban:
A fenti kód futtatása létrehozza a kívánt sémát az adatbázisban, és futtatja ezeket az SQL-lekérdezéseket.
A fenti program futtatásakor ellenőrizheti az adatokat és a leképezéseket mindkét táblában.
Hibernate egy az egyhez leképezés közös join táblával
Ez a megközelítés nem új mindannyiunk számára. Kezdjük a célzott DB struktúrával ebben a technikában.
Ebben a technikában a fő használandó annotáció a @JoinTable. Ez az annotáció az új tábla nevének (kötelező) és a két tábla idegen kulcsainak meghatározására szolgál. Lássuk, hogyan használjuk:
A@JoinTable annotációt a EmployeeEntity
osztályban használjuk. Ez deklarálja, hogy egy új EMPLOYEE_ACCOUNT
tábla jön létre két oszloppal EMPLOYEE_ID
(az EMPLOYEE tábla elsődleges kulcsa) és ACCOUNT_ID
(az ACCOUNT tábla elsődleges kulcsa).
A fenti entitások tesztelése a következő SQL-lekérdezéseket generálja a naplófájlokban:
Hibernate egy-egy leképezés közös elsődleges kulccsal
Ezzel a technikával a hibernate biztosítja, hogy a két táblában közös elsődleges kulcsértéket használjon. Így a EmployeeEntity
elsődleges kulcsa biztonságosan feltételezhető a AccountEntity
elsődleges kulcsának is.
A tábla szerkezete a következő lesz:
Ebben a megközelítésben a @PrimaryKeyJoinColumn a fő megjegyzést kell használni. Lássuk, hogyan használjuk.
@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate AccountEntity account;
A AccountEntity
oldalon továbbra is a tulajdonos entitástól függ a leképezés.
@OneToOne(mappedBy="account", cascade=CascadeType.ALL)private EmployeeEntity employee;
A fenti entitások tesztelése a következő SQL-lekérdezéseket generálja a naplófájlokban:
Hibernate one to one mapping with @MapsId
Ezzel a technikával a hibernate feltételezi, hogy a forrás és a cél azonos elsődleges kulcsértékekkel rendelkezik.
Ebben a megközelítésben az @MapsId a fő megjegyzést kell használni. Lássuk, hogyan használjuk.
@Idprivate Integer employeeId;@OneToOne @MapsIdprivate AccountEntity account;
A AccountEntity
oldalon továbbra is a tulajdonos entitástól függ a leképezés.
@Idprivate Integer accountId;
A fenti entitások tesztelése a következő SQL-lekérdezéseket generálja a naplófájlokban: