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.