Individuálny vzťah v Spoločnom parlamentnom zhromaždení
1. Úvod
V tomto tutoriáli sa pozrieme na rôzne spôsoby vytvárania individuálnych mapovaní v JPA.
Budeme potrebovať základné znalosti o rámci režimu dlhodobého spánku, preto si pozrite ďalšie informácie v našom Sprievodcovi režimom dlhodobého spánku s jarou.
2. Opis
Predpokladajme, že budujeme systém správy používateľov a náš šéf nás požiada, aby sme pre každého používateľa uložili poštovú adresu. Používateľ bude mať jednu poštovú adresu a na poštovú adresu bude viazaný iba jeden používateľ.
Toto je príklad vzájomného vzťahu, v tomto prípade medzi používateľ a adresa subjekty.
Pozrime sa, ako to môžeme implementovať v nasledujúcich častiach.
3. Používanie cudzieho kľúča
3.1. Modelovanie pomocou cudzieho kľúča
Poďme sa pozrieť na nasledujúci diagram ER, ktorý predstavuje mapovanie one-to-one založené na cudzom kľúči:
V tomto príklade adresa_id stĺpec v používateľov je cudzí kľúč k adresa.
3.2. Implementácia s cudzím kľúčom v JPA
Najskôr vytvorme Používateľ triedy a vhodne ju anotovať:
@Entity @Table (name = "users") verejná trieda User {@Id @GeneratedValue (strategy = GenerationType.AUTO) @Column (name = "id") private Long id; // ... @OneToOne (cascade = CascadeType.ALL) @JoinColumn (name = "address_id", referencedColumnName = "id") súkromná adresa adresy; // ... zakladatelia a zakladatelia}
Poznač si to umiestnime @Jeden na jedného anotácia v poli súvisiaci subjekt, Adresa.
Tiež musíme umiestniť @JoinColumn anotácia nakonfigurovať názov stĺpca v priečinku používateľov tabuľka, ktorá sa mapuje na primárny kľúč v priečinku adresa stôl. Ak nezadáme meno, režim dlhodobého spánku bude podľa niektorých pravidiel vyberať predvolené.
Nakoniec si všimnite v ďalšej entite, že nebudeme používať @JoinColumn anotácia tam. Je to tak preto, lebo to potrebujeme iba na serveri vlastniť strana vzťahu cudzieho kľúča. Jednoducho povedané, ktokoľvek vlastné stĺpec cudzí kľúč dostane @JoinColumn anotácia.
The Adresa entita sa ukáže o niečo jednoduchšia:
@Entity @Table (name = "adresa") verejná trieda Adresa {@Id @GeneratedValue (strategy = GenerationType.AUTO) @Column (name = "id") private Long id; // ... @OneToOne (mappedBy = "address") súkromný používateľ; // ... zakladatelia a zakladatelia}
Musíme tiež umiestniť @Jeden na jedného anotácia aj tu. Je to preto, že ide o obojsmerný vzťah. Adresná strana vzťahu sa nazýva nevlastní strane.
4. Používanie zdieľaného primárneho kľúča
4.1. Modelovanie pomocou zdieľaného primárneho kľúča
V tejto stratégii namiesto vytvárania nového stĺpca adresa_id, označíme primárny kľúčstĺpec (ID používateľa) z tabuľka adries ako cudzí kľúč k používateľov stôl:
Optimalizovali sme úložný priestor využitím skutočnosti, že tieto entity majú medzi sebou vzájomný vzťah.
4.2. Implementácia so zdieľaným primárnym kľúčom v JPA
Všimnite si, že naše definície sa menia len mierne:
@Entity @Table (name = "users") verejná trieda User {@Id @GeneratedValue (strategy = GenerationType.AUTO) @Column (name = "id") private Long id; // ... @OneToOne (mappedBy = "user", cascade = CascadeType.ALL) @PrimaryKeyJoinColumn private Address address; // ... zakladatelia a zakladatelia}
@Entity @Table (name = "adresa") verejná trieda Adresa {@Id @Column (name = "user_id") private Long id; // ... @OneToOne @MapsId @JoinColumn (name = "user_id") súkromný používateľ; // ... zakladatelia a zakladatelia}
The mappedBy atribút je teraz presunutý do Používateľ triedy, pretože cudzí kľúč je teraz prítomný v adresa stôl. Tiež sme pridali the @PrimaryKeyJoinColumn anotácia, ktorá naznačuje, že primárny kľúč súboru Používateľ entita sa používa ako hodnota cudzieho kľúča pre priradenú Adresa subjekt.
Stále musíme definovať @Id pole v Adresa triedy, ale všimnite si tento odkaz na ID používateľa v stĺpci a už sa nepoužíva @GeneratedValue anotácia. Tiež v poli, ktoré odkazuje na Používateľ, pridali sme the @MapsId anotácia, ktorá naznačuje, že hodnoty primárneho kľúča sa skopírujú z Používateľ subjekt.
5. Používanie tabuľky spojenia
Individuálne mapovania môžu byť dvoch typov - Voliteľné a Povinné. Doteraz sme videli iba povinné vzťahy.
Poďme si predstaviť, že naši zamestnanci sú spájaní s pracovnými stanicami. Je to individuálne, ale niekedy zamestnanec nemusí mať pracovnú stanicu a naopak.
5.1. Modelovanie pomocou spojovacej tabuľky
Stratégie, o ktorých sme diskutovali až doteraz nás nútime vkladať nulové hodnoty do stĺpca, aby sme zvládli voliteľné vzťahy.
Spravidla myslíme na vzťahy medzi mnohými, keď uvažujeme o spojovacej tabuľke, ale použitie tabuľky spojení v tomto prípade nám môže pomôcť vylúčiť tieto nulové hodnoty:
Teraz, kedykoľvek máme vzťah, urobíme záznam v emp_workstation tabuľky a vyhýbajte sa nulovým hodnotámcelkom.
5.2. Implementácia so spojovacou tabuľkou v JPA
Náš prvý použitý príklad @JoinColumn. Tentokrát použijeme @JoinTable:
@Entity @Table (name = "zamestnanec") verejná trieda Zamestnanec {@Id @GeneratedValue (strategy = GenerationType.AUTO) @Column (name = "id") private Long id; // ... @OneToOne (cascade = CascadeType.ALL) @JoinTable (name = "emp_workstation", joinColumns = {@JoinColumn (name = "employee_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn (meno = "workstation_id", referencedColumnName = "id")}) súkromná pracovná stanica WorkStation; // ... zakladatelia a zakladatelia}
@Entity @Table (name = "workstation") verejná trieda WorkStation {@Id @GeneratedValue (strategy = GenerationType.AUTO) @Column (name = "id") private Long id; // ... @OneToOne (mappedBy = "workStation") súkromný zamestnanec zamestnanec; // ... zakladatelia a zakladatelia}
@JoinTable dáva pokyn režimu dlhodobého spánku, aby použil stratégiu spojovacej tabuľky pri zachovaní vzťahu.
Tiež Zamestnanec je vlastníkom tohto vzťahu, pretože sme sa rozhodli pre anotáciu tabuľky spojenia.
6. Záver
V tomto tutoriáli sme sa naučili rôzne spôsoby udržiavania asociácie one-to-one v JPA a Hibernate a kedy ich používať.
Zdrojový kód tohto tutoriálu nájdete na GitHub.