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.


$config[zx-auto] not found$config[zx-overlay] not found