JPA @Embedded a @Embeddable
1. Prehľad
V tomto tutoriále uvidíme, ako môžeme mapovať jednu entitu, ktorá obsahuje vložené vlastnosti, na jednu databázovú tabuľku.
Na tento účel teda použijeme @Embeddable a @ Zabudované anotácie poskytované rozhraním Java Persistence API (JPA).
2. Kontext údajového modelu
Najskôr si definujme tabuľku s názvom spoločnosti.
The spoločnosti Táto tabuľka bude obsahovať základné informácie, ako je názov spoločnosti, adresa a telefón, ako aj informácie o kontaktnej osobe:
public class Company {private Integer id; súkromné meno reťazca; súkromná adresa reťazca; súkromný telefón String; private String contactFirstName; private String contactLastName; súkromný reťazec contactPhone; // štandardné getre, setre}
Zdá sa však, že kontaktná osoba by mala byť vyčlenená do samostatnej triedy. Problém je v tom nechceme pre tieto podrobnosti vytvoriť samostatnú tabuľku. Pozrime sa teda, čo môžeme urobiť.
3. @Embeddable
JPA poskytuje @Embeddable anotácia, ktorá deklaruje, že trieda bude vložená inými entitami.
Poďme definovať triedu, aby sme abstrahovali od podrobností kontaktnej osoby:
@Embeddable verejná trieda ContactPerson {private String firstName; private String priezvisko; súkromný telefón String; // štandardné getre, setre}
4. @Vložené
Anotácia Spoločného parlamentného zhromaždenia @ Zabudované sa používa na vloženie typu do inej entity.
Poďme ďalej upraviť naše Spoločnosť trieda. Pridáme anotácie JPA a tiež zmeníme použitie Kontaktná osoba namiesto samostatných polí:
@Entity public class Company {@Id @GeneratedValue private Integer id; súkromné meno reťazca; súkromná adresa reťazca; súkromný telefón String; @Vložený súkromný ContactPerson contactPerson; // štandardné getre, setre}
Vďaka tomu máme svoju entitu Spoločnosť, vloženie podrobností kontaktnej osoby a mapovanie do jednej databázovej tabuľky.
Stále však máme ešte jeden problém, a to je ako bude JPA mapovať tieto polia do stĺpcov databázy.
5. Prepísanie atribútov
Ide o to, že naše polia sa nazývali veci ako contactFirstName v našom origináli Spoločnosť trieda a teraz krstné meno v našom Kontaktná osoba trieda. Takže SPS ich bude chcieť zmapovať contact_first_name a krstné meno, resp.
Okrem toho, že to nie je ideálne, v skutočnosti nás zlomí s našou duplikáciou telefón stĺpec.
Môžeme teda použiť @AttributeOverrides a @AttibuteOverride prepísať vlastnosti stĺpca nášho vloženého typu.
Pridajme to k Kontaktná osoba pole v našom Spoločnosť subjekt:
@Embedded @AttributeOverrides ({@AttributeOverride (name = "firstName", column = @Column (name = "contact_first_name")), @AttributeOverride (name = "lastName", column = @Column (name = "contact_last_name")), @AttributeOverride (name = "phone", column = @Column (name = "contact_phone"))}) private ContactPerson contactPerson;
Pretože tieto anotácie idú do poľa, môžeme mať rôzne prepísania pre každú obklopujúcu entitu.
6. Záver
V tomto tutoriáli sme nakonfigurovali entitu s niektorými vloženými atribútmi a namapovali sme ich na rovnakú databázovú tabuľku ako priložená entita. Na to sme použili @ Zabudované, @Embeddable, @AttributeOverrides a @AttributeOverride anotácie poskytované rozhraním Java Persistence API.
Zdrojový kód príkladu je ako vždy k dispozícii na serveri GitHub.