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.