Rozdiel medzi @JoinColumn a mappedBy
1. Úvod
Vzťahy JPA môžu byť jednosmerné alebo obojsmerné. Znamená to jednoducho, že ich môžeme modelovať ako atribút presne na jednu z pridružených entít alebo na obidve.
Definovanie smeru vzťahu medzi entitami nemá žiadny vplyv na mapovanie databázy. Definuje iba smery, ktorými tento vzťah používame v našom doménovom modeli.
Pre obojsmerný vzťah zvyčajne definujeme:
- vlastniaca strana
- inverzná alebo referenčná strana
The @JoinColumn anotácia nám pomáha určiť stĺpec, ktorý použijeme na pripojenie k združeniu entít alebo kolekcii prvkov. Na druhej strane mappedBy atribút sa používa na definovanie strany vzťahu (strana, ktorá nevlastní) vzťahu.
V tomto rýchlom návode sa pozrieme na rozdiel medzi @JoinColumn a mappedByv JPA. Predstavíme tiež, ako ich používať v združení one-to-many.
2. Počiatočné nastavenie
Ak budeme v tejto príručke pokračovať, povedzme, že máme dve entity: Zamestnanec a Email.
Je zrejmé, že zamestnanec môže mať viac e-mailových adries. Daná e-mailová adresa však môže patriť presne jednému zamestnancovi.
Znamená to, že zdieľajú združenie one-to-many:
Aj v našom modeli RDBMS budeme mať cudzí kľúč zamestnanecké ID v našom Email subjekt odkazujúci na id atribút Zamestnanec.
3. @JoinColumn Anotácia
Vo vzťahu dvojstranný / mnohostranný strana, ktorá je vlastníkom, je obvykle definovaná na „veľa strana vzťahu. Je to zvyčajne strana, ktorá vlastní cudzí kľúč.
The @JoinColumn anotácia definuje, že skutočné fyzické mapovanie na strane odovzdávajúcej:
@Entity public class Email {@Id @GeneratedValue (strategy = GenerationType.AUTO) private Long id; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn (name = "employee_id") súkromný zamestnanec; // ...}
Znamená to jednoducho, že naše Email entita bude mať pomenovaný stĺpec cudzieho kľúča zamestnanecké ID s odkazom na primárny atribút id nášho Zamestnanec subjekt.
4. mappedBy Atribút
Len čo sme definovali vlastnú stránku vzťahu, Hibernate už má všetky informácie, ktoré potrebuje na zmapovanie tohto vzťahu v našej databáze. Aby bolo toto združenie obojsmerné, musíme iba definovať stranu odkazov. Inverzná alebo referenčná strana sa jednoducho mapujú na stranu, ktorá je vlastníkom.
Môžeme ľahko použiť mappedBy atribút @OneToMany anotácia. Poďme si teda definovať našu Zamestnanec subjekt:
@Entity public class Employee {@Id @GeneratedValue (strategy = GenerationType.AUTO) private Long id; @OneToMany (fetch = FetchType.LAZY, mappedBy = "zamestnanec") súkromné zoznamy e-mailov; // ...}
Tu, hodnota mappedBy je názov atribútu mapovania asociácií na strane, ktorá je vlastníkom. Týmto sme teraz vytvorili obojsmerné spojenie medzi našimi Zamestnanec a Email subjekty.
5. Záver
V tomto návode sme sa pozreli na rozdiel medzi @JoinColumn a mappedBy a ako ich použiť v obojsmernom vzťahu jeden na viac.
The @JoinColumn anotácia definuje skutočné fyzické mapovanie na strane, ktorá ho vlastní. Na druhej strane je referenčná strana definovaná pomocou mappedBy atribút @OneToMany anotácia.
Ako obvykle je zdrojový kód k dispozícii na serveri Github.