Složené Primární Klíče v JPA
Úvod
V tomto tutoriálu, budeme se učit o Složené Primární Klíče a odpovídající popisy v JPA.
kompozitní primární klíče
složený primární klíč-nazývaný také složený klíč – je kombinací dvou nebo více sloupců pro vytvoření primárního klíče pro tabulku.
v JPA máme dvě možnosti, jak definovat složené klíče: anotace @IdClass a @EmbeddedId.
abychom definovali složené primární klíče, měli bychom dodržovat některá pravidla:
- kompozitní primární klíč třídy musí být veřejné,
- To musí mít ne-arg constructor
- musí definovat equals() a hashCode() metody
- To musí být Serializable
IdClass Anotace
řekněme, že máme tabulku s názvem Účtu, a to má dva sloupce – accountNumber, accountType–, které tvoří složený klíč. Teď to musíme zmapovat v JPA.
podle specifikace JPA vytvoříme třídu AccountId s těmito poli primárního klíče:
public class AccountId implements Serializable { private String accountNumber; private String accountType; // default constructor public AccountId(String accountNumber, String accountType) { this.accountNumber = accountNumber; this.accountType = accountType; } // equals() and hashCode()}
dále spojme třídu AccountId s účtem účetní jednotky.
abychom to mohli udělat, musíme entitu anotovat anotací @IdClass. Musíme také deklarovat pole z AccountId třídy v Účtu subjektu a komentovat je s @Id:
@Entity@IdClass(AccountId.class)public class Account { @Id private String accountNumber; @Id private String accountType; // other fields, getters and setters}
Na EmbeddedId Anotace
@EmbeddedId je alternativou k @IdClass anotace.
uvažujme další příklad, kde musíme přetrvávat některé informace o knize s názvem a jazykem jako primární klíčová pole.
V tomto případě, primární klíč třídy BookId, musí být komentovaný s @Embeddable:
@Embeddablepublic class BookId implements Serializable { private String title; private String language; // default constructor public BookId(String title, String language) { this.title = title; this.language = language; } // getters, equals() and hashCode() methods}
Pak musíme vložte si této třídy v Knize entity pomocí @EmbeddedId:
@Entitypublic class Book { @EmbeddedId private BookId bookId; // constructors, other fields, getters and setters}
@IdClass vs @EmbeddedId
Jak jsme právě viděli, na rozdíl povrchu mezi těmito dvěma je, že s @IdClass, museli jsme zadat sloupce dvakrát – jednou v AccountId a znovu v Úvahu. Ale s @EmbeddedId jsme to neudělali.
existují i jiné kompromisy.
například tyto různé struktury ovlivňují dotazy JPQL, které píšeme.
například, s @IdClass, dotaz je trochu jednodušší:
SELECT account.accountNumber FROM Account account
S @EmbeddedId, musíme udělat jednu extra traversal:
SELECT book.bookId.title FROM Book book
Také, @IdClass může být docela užitečné v místech, kde jsme pomocí composite klíčové třídy, které nemůžeme změnit.
a Konečně, pokud máme přístup k části composite klíčové individuálně, můžeme využít @IdClass, ale v místech, kde jsme se často používají úplný identifikátor jako objekt, @EmbeddedId je přednostní.
závěr
v tomto rychlém článku zkoumáme kompozitní primární klíče v JPA.
jako vždy, kompletní kód pro tento článek lze nalézt na Github.