Definere indekser i JPA

1. Introduksjon

I denne opplæringen vil vi diskutere definere indekser ved hjelp av JPA-er @Index kommentar. Gjennom eksempler lærer vi hvordan vi kan definere vår første indeks ved hjelp av JPA og Hibernate. Etter det skal vi endre definisjonen som viser flere måter å tilpasse indeksen på.

2. @Index Kommentar

La oss begynne med å lage et raskt sammendrag. Databaseindeksen er en datastruktur som forbedrer hastigheten på datainnhentingsoperasjoner på et bord på bekostning av ekstra skrive- og lagringsplass. For det meste er det en kopi av valgte kolonner av data fra en enkelt tabell. Vi bør lage indekser for å øke ytelsen på vårt utholdenhetslag.

JPA lar oss oppnå det ved å definere indekser fra koden vår ved hjelp av @Index. Denne kommentaren tolkes av prosessen med generering av skjema, og skaper artefakter automatisk. Merk at det ikke er nødvendig å spesifisere noen indeks for enhetene våre.

La oss nå ta en titt på definisjonen.

2.1. javax.persistence.Index

Indeksstøtten er endelig lagt til i JPA 2.1-spesifikasjonen av javax.persistence.Index. Denne kommentaren lar oss definere en indeks for tabellen vår og tilpasse den deretter:

@Target ({}) @Retention (RUNTIME) public @interface Index {Strengnavn () standard ""; Strengkolonneliste (); boolsk unik () standard usann; }

Som vi kan se, er bare kolonneliste attributt er obligatorisk, som vi må definere. Vi vil se nærmere på hver av parametrene senere og gå gjennom eksempler.

2.2. JPA vs. dvalemodus

Vi vet at JPA bare er en spesifikasjon. For å fungere riktig, må vi også spesifisere en leverandør av utholdenhet. Som standard er Hibernate Framework JPAs implementering levert av Spring. Mer om det kan du lese her.

Vi bør huske at indeksstøtten er lagt til JPA veldig sent. Før det støtter mange ORM Frameworks indekser ved å introdusere sin egen tilpassede implementering, som kan fungere annerledes. Hibernate Framework gjorde det også og introduserte org.hibernate.annotations.Index kommentar. Mens vi arbeider med dette rammeverket, må vi være forsiktige med at det er utfaset siden JPA 2.1-spesifikasjonsstøtten, og vi bør bruke JPAs.

Nå når vi har litt teknisk bakgrunn, kan vi gå gjennom eksempler og definere vår første indeks i JPA.

3. Definere @Index

I denne delen implementerer vi indeksen vår. Senere vil vi prøve å endre den, og presentere forskjellige muligheter for tilpasning.

Før vi begynner, må vi initialisere prosjektet vårt riktig og definere en modell.

La oss implementere en Student enhet:

@Entity @Table offentlig klasse Studentimplement Serialiserbar {@Id @GeneratedValue privat Lang id; privat streng fornavn; privat streng etternavn; // getters, setters}

Når vi har vår modell, la oss implementere den første indeksen. Alt vi trenger å gjøre er å legge til et @Index kommentar. Vi gjør det i @Bord kommentar under indekser Egenskap. La oss huske å spesifisere navnet på kolonnen:

@Table (indekser = @Index (columnList = "fornavn"))

Vi har erklært den aller første indeksen ved hjelp av fornavn kolonne. Når vi utfører skjemaopprettingsprosessen, kan vi validere den:

[hoved] DEBUG org.hibernate.SQL - opprett indeks IDX2gdkcjo83j0c2svhvceabnnoh på Student (fornavn)

Nå er det på tide å endre erklæringen vår som viser flere funksjoner.

3.1. @Index Navn

Som vi kan se, må indeksen vår ha et navn. Som standard, hvis vi ikke spesifiserer det, er det en leverandørgenerert verdi. Når vi vil ha en tilpasset etikett, bør vi bare legge til Navn Egenskap:

@Index (name = "fn_index", columnList = "firstName")

Denne varianten oppretter en indeks med et brukerdefinert navn:

[main] DEBUG org.hibernate.SQL - opprett indeks fn_index på Student (fornavn)

Videre kan vi opprette indeksen vår i det forskjellige skjemaet ved å spesifisere skjemaets navn i Navn:

@Index (name = "schema2.fn_index", columnList = "firstName")

3.2. Flerkolonne @Index

La oss nå se nærmere på kolonneliste syntaks:

kolonne :: = index_column [, index_column] * index_column :: = column_name [ASC | DESC]

Som vi allerede vet, kan vi spesifisere kolonnenavnene som skal inkluderes i indeksen. Selvfølgelig kan vi spesifisere flere kolonner til den enkelte indeksen. Vi gjør det ved å skille navnene med et komma:

@Index (navn = "mulitIndex1", columnList = "fornavn, etternavn") @Index (navn = "mulitIndex2", columnList = "etternavn, fornavn")
[main] DEBUG org.hibernate.SQL - opprett indeks mulitIndex1 på Student (fornavn, etternavn) [main] DEBUG org.hibernate.SQL - opprett indeks mulitIndex2 på Student (etternavn, fornavn)

Merk at utholdenhetsleverandøren må følge den angitte rekkefølgen på kolonnene. I vårt eksempel er indekser litt forskjellige, selv om de angir det samme settet med kolonner.

3.3. @Index Rekkefølge

Når vi gjennomgikk syntaksen i forrige avsnitt, kan vi også spesifisere ASC (stigende) og DESC (synkende) verdier etter kolonnenavn. Vi bruker den til å angi sorteringsrekkefølgen for verdiene i den indekserte kolonnen:

@Index (navn = "mulitSortIndex", columnList = "fornavn, etternavn DESC")
[hoved] DEBUG org.hibernate.SQL - opprett indeks mulitSortIndex på Student (fornavn, etternavn beskrivelse)

Vi kan spesifisere rekkefølgen for hver kolonne. Hvis vi ikke gjør det, antas den stigende rekkefølgen.

3.4. @Index Unikt

Den siste valgfrie parameteren er a unik attributt, som definerer om indeksen er unik. En unik indeks sikrer at de indekserte feltene ikke lagrer dupliserte verdier. Som standard er det falsk. Hvis vi vil endre det, kan vi erklære:

@Index (name = "uniqueIndex", columnList = "firstName", unik = true)
[hoved] DEBUG org.hibernate.SQL - endre tabell Student legge til begrensning unikIndex unik (fornavn)

Når vi lager en indeks på den måten, legger vi til en unik begrensning på kolonnene våre, på samme måte hvordan som en unik attributt på @Kolonne kommentar gjør. @Index har en fordel over @Kolonne på grunn av muligheten til å erklære unike begrensninger for flere kolonner:

@Index (navn = "unikMulitIndex", columnList = "fornavn, etternavn", unik = sann)

3.5. Flere @Index på en enkelt enhet

Så langt har vi implementert forskjellige varianter av indeksen. Selvfølgelig er vi ikke begrenset til å erklære en enkelt indeks over enheten. La oss samle erklæringer og spesifisere hver enkelt indeks på en gang. Vi gjør det ved å gjenta @Index kommentar i parentes og atskilt med komma:

@Entity @Table (indexes = {@Index (columnList = "firstName"), @Index (name = "fn_index", columnList = "firstName"), @Index (name = "mulitIndex1", columnList = "firstName, lastName" ), @Index (name = "mulitIndex2", columnList = "lastName, firstName"), @Index (name = "mulitSortIndex", columnList = "firstName, lastName DESC"), @Index (name = "uniqueIndex", columnList = "fornavn", unikt = sant), @Index (navn = "uniktMulitIndex", columnList = "fornavn, etternavn", unikt = sant)}) offentlig klasse Elevredskaper Serialiserbar

I tillegg kan vi også lage flere indekser for samme sett med kolonner.

3.6. Primærnøkkel

Når vi snakker om indekser, må vi stoppe en stund ved primærnøklene. Som vi vet, hver enhet som forvaltes av EntityManager må spesifisere en identifikator som er kartlagt i primærnøkkelen.

Generelt er primærnøkkelen en bestemt type unik indeks. Det er verdt å legge til at vi ikke trenger å erklære definisjonen av denne nøkkelen på den måten som ble presentert før. Alt gjøres automatisk av @Id kommentar.

3.7. Ikke-enhet @Index

Etter at vi har lært forskjellige måter å implementere indekser på, bør vi nevne det @Bord er ikke det eneste stedet å spesifisere dem. På samme måte kan vi deklarere indekser i @SecondaryTable, @CollectionTable, @JoinTable, @TableGenerator kommentarer. Disse eksemplene er ikke dekket i denne artikkelen. For mer informasjon, vennligst sjekk javax. utholdenhet JavaDoc.

4. Konklusjon

I denne artikkelen diskuterte vi å deklarere indekser ved hjelp av JPA. Vi startet med å gjennomgå den generelle kunnskapen om dem. Senere implementerte vi vår første indeks og lærte gjennom eksempler hvordan vi kunne tilpasse den ved å endre navn, inkluderte kolonner, rekkefølge og unikhet. Til slutt snakket vi om primærnøkler og flere måter og steder hvor vi kan erklære dem.

Som alltid er eksemplene fra artikkelen tilgjengelig på GitHub.