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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.