Hibernate One to One Mapping Annotation Example

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.

  1. Az első technika a legelterjedtebb, és egy idegen kulcs oszlopot használ az egyik táblában.
  2. 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.
  3. 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:

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

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