Sastavljeni primarni ključevi u JPA

1. Uvod

U ovom uputstvu naučit ćemo o složenim primarnim ključevima i odgovarajućim bilješkama u JPA.

2. Sastavljeni primarni ključevi

Sastavljeni primarni ključ - koji se naziva i složeni ključ - kombinacija je dvaju ili više stupaca koji čine primarni ključ za tablicu.

U JPA imamo dvije mogućnosti za definiranje složenih tipki: @IdClass i @EmbeddedId bilješke.

Da bismo definirali složeni primarni ključ, trebali bismo slijediti neka pravila:

  • Sastavljena klasa primarnog ključa mora biti javna
  • Mora imati konstruktor bez argumenata
  • To mora definirati jednako () i hashCode () metode
  • Mora biti Serializabilno

3. The IdClass Bilješka

Recimo da imamo stol koji se zove Račun i ima dva stupca - accountNumber, accountType - koji tvore složeni ključ. Sad to moramo mapirati u JPA.

Prema JPA specifikaciji, izradimo ID računa razred s ovim poljima primarnog ključa:

javna klasa AccountId implementira Serializable {private String accountNumber; private String accountType; // zadani konstruktor public AccountId (String accountNumber, String accountType) {this.accountNumber = accountNumber; this.accountType = accountType; } // jednako () i hashCode ()}

Dalje, pridružimo ID računa razred s entitetom Račun.

Da bismo to učinili, moramo entitet označiti znakom @IdClass bilješka. Također moramo deklarirati polja iz ID računa klasa u entitetu Račun i bilježite ih s @Iskaznica:

@Entity @IdClass (AccountId.class) račun javne klase {@Id private String accountNumber; @Id private String accountType; // ostala polja, geteri i postavljači}

4. The EmbeddedId Bilješka

@EmbeddedId je alternativa @IdClass bilješka.

Razmotrimo još jedan primjer u kojem moramo zadržati neke podatke o Knjiga s titula i Jezik kao polja primarnog ključa.

U ovom slučaju, razred primarnog ključa, BookId, mora biti označen s @Embeddable:

@Embeddable javna klasa BookId implementira Serializable {private String title; privatni jezik gudača; // zadani konstruktor public BookId (naslov niza, jezik niza) {this.title = naslov; this.language = jezik; } // metode getters, equals () i hashCode ()}

Zatim, moramo ugraditi ovu klasu u Book entitet koji koristi @EmbeddedId:

@ Entity public class Book {@EmbeddedId private BookId bookId; // konstruktori, druga polja, getteri i postavljači}

5. @IdClass nasuprot @EmbeddedId

Kao što smo upravo vidjeli, razlika na površini između ove dvije je ona s @IdClass, morali smo navesti stupce dva puta - jednom u ID računa i opet u Račun. Ali, sa @EmbeddedId nismo.

Postoje ipak neki drugi kompromisi.

Na primjer, ove različite strukture utječu na JPQL upite koje pišemo.

Na primjer, sa @IdClass, upit je malo jednostavniji:

ODABERITE račun.broj računa s RAČUNA računa

S @EmbeddedId, moramo napraviti jedan dodatni prijelaz:

ODABERITE book.bookId.title IZ Book book

Također, @IdClass može biti vrlo korisno na mjestima gdje mikoriste složenu klasu ključeva koju ne možemo izmijeniti.

Napokon, ako ćemo dijelovima kompozitnog ključa pristupiti pojedinačno, možemo to iskoristiti @IdClass, ali na mjestima na kojima često koristimo potpuni identifikator kao objekt, @EmbeddedId preferira se.

6. Zaključak

U ovom kratkom članku istražujemo složene primarne ključeve u JPA.

Kao i uvijek, cjeloviti kôd za ovaj članak nalazi se na Githubu.