Sammensatte Primærnøkler i JPA

Introduksjon

i denne opplæringen lærer vi Om Sammensatte Primærnøkler og tilhørende merknader i JPA.

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 komposittnøklene: @IdClass og @ EmbeddedId-merknadene.

for å definere sammensatte primære nøkler, bør vi følge noen regler:

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

Idclass – Merknaden

La Oss si at vi har et bord som heter konto, og det har to kolonner-kontonummer, kontotype-som danner komposittnøkkelen. Nå må vi kartlegge det I JPA.

i Henhold TIL jpa-spesifikasjonen, la oss opprette En AccountId-klasse med disse primærnøkkelfeltene:

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()}

la Oss deretter knytte AccountId-klassen til enhetskontoen.

for å gjøre det, må vi annotere enheten med @IdClass-merknaden. Vi må også deklarere feltene fra AccountId-klassen i enhetens Konto og annotere dem med @ Id:

@Entity@IdClass(AccountId.class)public class Account { @Id private String accountNumber; @Id private String accountType; // other fields, getters and setters}

EmbeddedId-Merknaden

@EmbeddedId er et alternativ til @ IdClass-merknaden.

la oss vurdere et annet eksempel der vi må fortsette litt informasjon om En Bok med tittel og språk som primærnøkkelfeltene.

i dette tilfellet må primærnøkkelklassen, BookId, annoteres med @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}

Deretter må vi legge inn denne klassen i Bokenheten ved hjelp av @ EmbeddedId:

@Entitypublic class Book { @EmbeddedId private BookId bookId; // constructors, other fields, getters and setters}

@IdClass vs @ EmbeddedId

som vi nettopp så, er forskjellen på overflaten mellom disse to at med @ IdClass måtte vi spesifisere kolonnene to ganger-en Gang I AccountId og igjen I Konto. Men med @ EmbeddedId gjorde vi det ikke.

det er noen andre avvik, skjønt.

for eksempel påvirker DISSE forskjellige strukturene JPQL-spørringene vi skriver.

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

SELECT account.accountNumber FROM Account account

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

SELECT book.bookId.title FROM Book book

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

Til Slutt, hvis vi skal få tilgang til deler av komposittnøkkelen individuelt, kan vi bruke @IdClass, men på steder der vi ofte bruker den komplette identifikatoren som et objekt, er @EmbeddedId foretrukket.

Konklusjon

i denne raske artikkelen undersøker vi sammensatte primærnøkler i JPA.

som alltid kan den komplette koden for denne artikkelen bli funnet over På Github.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.