Sammensatte primærnøkler i JPA

1. Introduksjon

I denne opplæringen lærer vi om sammensatte primærnøkler og tilsvarende merknader i JPA.

2. Sammensatte primærnøkler

En sammensatt primærnøkkel - også kalt en sammensatt nøkkel - er en kombinasjon av to eller flere kolonner for å danne en primærnøkkel for en tabell.

I JPA har vi to alternativer for å definere de sammensatte tastene: @IdClass og @EmbeddedId kommentarer.

For å definere de sammensatte primærnøklene, bør vi følge noen regler:

  • Den sammensatte primærnøkkelklassen må være offentlig
  • Det må ha en no-arg konstruktør
  • Det må definere er lik() og hashCode () metoder
  • Det må være Serialiserbar

3. Den IdClass Kommentar

La oss si at vi har et bord som heter Regnskap og den har to kolonner - accountNumber, accountType - som danner den sammensatte nøkkelen. Nå må vi kartlegge det i JPA.

I henhold til JPA-spesifikasjonen, la oss lage en Konto-ID klasse med disse primære nøkkelfeltene:

offentlig klasse AccountId implementerer Serializable {private String accountNumber; privat streng kontoType; // standard konstruktør offentlig AccountId (String accountNumber, String accountType) {this.accountNumber = accountNumber; this.accountType = accountType; } // er lik () og hashCode ()}

La oss deretter knytte Konto-ID klasse med enheten Regnskap.

For å gjøre det, må vi kommentere enheten med @IdClass kommentar. Vi må også erklære feltene fra Konto-ID klasse i enheten Regnskap og kommentere dem med @Id:

@Entity @IdClass (AccountId.class) offentlig klasse konto {@Id privat String accountNumber; @Id privat streng kontoType; // andre felt, getters og setters}

4. Den EmbeddedId Kommentar

@EmbeddedId er et alternativ til @IdClass kommentar.

La oss se på et annet eksempel der vi må vedvare litt informasjon om en Bok med tittel og Språk som de viktigste nøkkelfeltene.

I dette tilfellet, primærnøkkelklassen, BookId, må kommenteres med @Embeddable:

@Embeddable public class BookId implementerer Serializable {private String title; private String språk; // standard konstruktør offentlig BookId (streng tittel, streng språk) {this.title = tittel; dette.språk = språk; } // getters, equals () og hashCode () metoder}

Så må vi bygge denne klassen inn i Bogså enhet som bruker @EmbeddedId:

@Entity public class Book {@EmbeddedId private BookId bookId; // konstruktører, andre felt, getters og setters}

5. @IdClass vs. @EmbeddedId

Som vi nettopp så, er forskjellen på overflaten mellom disse to den med @IdClassmåtte vi spesifisere kolonnene to ganger - en gang i Konto-ID og igjen i Regnskap. Men med @EmbeddedId det gjorde vi ikke.

Det er noen andre kompromisser, skjønt.

For eksempel påvirker disse forskjellige strukturene JPQL-spørsmålene vi skriver.

For eksempel med @IdClass, spørringen er litt enklere:

SELECT account.accountNumber FROM Account account

Med @EmbeddedId, må vi gjøre en ekstra traversal:

VELG book.bookId.title FROM Book book

Også, @IdClass kan være ganske nyttig på steder der vibruker en sammensatt nøkkelklasse som vi ikke kan endre.

Til slutt, hvis vi skal få tilgang til deler av den sammensatte nøkkelen hver for seg, kan vi gjøre bruk av @IdClass, men på steder der vi ofte bruker den komplette identifikatoren som et objekt, @EmbeddedId er foretrukket.

6. Konklusjon

I denne raske artikkelen utforsker vi sammensatte primærnøkler i JPA.

Som alltid kan den komplette koden for denne artikkelen finnes på Github.