Zložené primárne kľúče v JPA
1. Úvod
V tomto tutoriále sa dozvieme o zložených primárnych kľúčoch a príslušných anotáciách v JPA.
2. Zložené primárne klávesy
Zložený primárny kľúč - nazývaný tiež zložený kľúč - je kombinácia dvoch alebo viacerých stĺpcov, ktoré tvoria primárny kľúč pre tabuľku.
V JPA máme dve možnosti na definovanie zložených kľúčov: @IdClass a @EmbeddedId anotácie.
Pri definovaní zložených primárnych kľúčov by sme sa mali riadiť niektorými pravidlami:
- Trieda zloženého primárneho kľúča musí byť verejná
- Musí mať konštruktor no-arg
- Musí to definovať rovná sa () a hashCode () metódy
- Musí to byť Serializovateľný
3. The IdClass Anotácia
Povedzme, že máme tabuľku s názvom Účet a má dva stĺpce - accountNumber, accountType - ktoré tvoria zložený kľúč. Teraz to musíme zmapovať v JPA.
Podľa špecifikácie JPA vytvorme Číslo účtu triedy s týmito poliami primárneho kľúča:
public class AccountId implementuje Serializable {private String accountNumber; private String accountType; // predvolený konštruktor public AccountId (reťazec accountNumber, reťazec accountType) {this.accountNumber = accountNumber; this.accountType = accountType; } // equals () a hashCode ()}
Ďalej si spojme Číslo účtu triedy s entitou Účet.
Aby sme to mohli urobiť, musíme entitu anotovať pomocou @IdClass anotácia. Polia musíme tiež deklarovať z Číslo účtu triedy v účtovnej jednotke Účet a anotovať ich pomocou @Id:
@Entity @IdClass (AccountId.class) verejná trieda Účet {@Id súkromný reťazec accountNumber; @Id private String accountType; // ďalšie polia, getre a setre}
4. The EmbeddedId Anotácia
@EmbeddedId je alternatívou k @IdClass anotácia.
Uvažujme o ďalšom príklade, keď musíme pretrvávať niektoré informácie o a Kniha s titul a Jazyk ako polia primárneho kľúča.
V tomto prípade je trieda primárneho kľúča, BookId, musí byť označený s @Embeddable:
@Embeddable verejná trieda BookId implementuje Serializable {private String title; súkromný reťazcový jazyk; // predvolený konštruktor public BookId (názov reťazca, jazyk reťazca) {this.title = title; this.language = jazyk; } // metódy geters, equals () a hashCode ()}
Potom musíme túto triedu vložiť do Bdobre subjekt pomocou @EmbeddedId:
@Entity public class Book {@EmbeddedId private BookId bookId; // konštruktory, ďalšie polia, getre a setre}
5. @IdClass vs @EmbeddedId
Ako sme práve videli, rozdiel na povrchu medzi týmito dvoma je ten, že @IdClass, museli sme určiť stĺpce dvakrát - raz v Číslo účtu a znova v Účet. Ale s @EmbeddedId my nie.
Existujú však aj ďalšie kompromisy.
Napríklad tieto rôzne štruktúry ovplyvňujú dotazy JPQL, ktoré píšeme.
Napríklad s @IdClass, dopyt je o niečo jednoduchší:
VYBERTE account.accountNumber FROM Účet účtu
S @EmbeddedId, musíme urobiť ešte jeden prechod:
VYBERTE book.bookId.title OD Knižnej knihy
Tiež @IdClass môže byť celkom užitočný na miestach, kde smepoužívajú zloženú triedu kľúčov, ktorú nemôžeme upraviť.
Nakoniec, ak budeme pristupovať k častiam zloženého kľúča jednotlivo, môžeme ich použiť @IdClass, ale na miestach, kde ako objekt často používame úplný identifikátor, @EmbeddedId je výhodné.
6. Záver
V tomto rýchlom článku preskúmame zložené primárne kľúče v JPA.
Kompletný kód tohto článku nájdete ako vždy na serveri Github.