Definition af indekser i JPA

1. Introduktion

I denne vejledning diskuterer vi definerer indekser ved hjælp af JPA'er @Indeks kommentar. Gennem eksempler lærer vi, hvordan vi definerer vores første indeks ved hjælp af JPA og Hibernate. Derefter vil vi ændre definitionen, der viser yderligere måder at tilpasse indekset på.

2. @Indeks Kommentar

Lad os begynde med at lave et hurtigt resumé. Databaseindekset er en datastruktur, der forbedrer hastigheden af ​​datahentningsoperationer på en tabel på bekostning af yderligere skrivning og lagerplads. For det meste er det en kopi af valgte kolonner af data fra en enkelt tabel. Vi skal oprette indekser for at øge ydeevnen på vores persistenslag.

JPA giver os mulighed for at opnå det ved at definere indekser fra vores kode ved hjælp af @Indeks. Denne kommentar fortolkes af skema-genereringsprocessen, der opretter artefakter automatisk. Bemærk, at det ikke er nødvendigt at angive et indeks for vores enheder.

Lad os nu se på definitionen.

2.1. javax.persistence.Index

Indeksstøtten er endelig tilføjet i JPA 2.1-specifikationen af javax.persistence.Index. Denne kommentar lader os definere et indeks til vores tabel og tilpasse det i overensstemmelse hermed:

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

Som vi kan se, er kun den kolonneliste attribut er obligatorisk, som vi skal definere. Vi vil se nærmere på hver af parametrene senere og gennemgå eksempler.

2.2. JPA vs. dvale

Vi ved, at JPA kun er en specifikation. For at fungere korrekt er vi også nødt til at angive en udholdenhedsudbyder. Hibernate Framework er som standard JPA's implementering leveret af Spring. Mere om det kan du læse her.

Vi skal huske, at indeksstøtten er blevet tilføjet til JPA meget sent. Før det understøtter mange ORM Frameworks indekser ved at introducere deres egen brugerdefinerede implementering, som muligvis fungerer forskelligt. Hibernate Framework gjorde det også og introducerede org.hibernate.annotations.Index kommentar. Mens vi arbejder med denne ramme, skal vi være forsigtige med, at den er udfaset siden JPA 2.1-specifikationsstøtten, og vi bør bruge JPA's.

Når vi nu har teknisk baggrund, kan vi gå igennem eksempler og definere vores første indeks i JPA.

3. Definition af @Indeks

I dette afsnit implementerer vi vores indeks. Senere vil vi prøve at ændre det ved at præsentere forskellige muligheder for tilpasning.

Før vi starter, skal vi initialisere vores projekt korrekt og definere en model.

Lad os implementere en Studerende enhed:

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

Når vi har vores model, lad os implementere det første indeks. Alt, hvad vi skal gøre er at tilføje en @Indeks kommentar. Vi gør det i @Bord kommentar under indekser attribut. Lad os huske at specificere kolonnens navn:

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

Vi har erklæret det allerførste indeks ved hjælp af fornavn kolonne. Når vi udfører skemaoprettelsesprocessen, kan vi validere den:

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

Nu er det tid til at ændre vores erklæring, der viser yderligere funktioner.

3.1. @Indeks Navn

Som vi kan se, skal vores indeks have et navn. Som standard, hvis vi ikke specificerer det, er det en udbydergenereret værdi. Når vi vil have en brugerdefineret etiket, skal vi blot tilføje navn attribut:

@Index (navn = "fn_index", columnList = "fornavn")

Denne variant opretter et indeks med et brugerdefineret navn:

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

Desuden kan vi oprette vores indeks i det forskellige skema ved at angive skemas navn i navn:

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

3.2. Multikolonne @Indeks

Lad os nu se nærmere på kolonneliste syntaks:

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

Som vi allerede ved, kan vi specificere de kolonnenavne, der skal inkluderes i indekset. Selvfølgelig kan vi angive flere kolonner til det enkelte indeks. Vi gør det ved at adskille navnene med et komma:

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

Bemærk, at udholdenhedsudbyderen skal overholde den specificerede rækkefølge for kolonnerne. I vores eksempel er indekser lidt forskellige, selvom de angiver det samme sæt kolonner.

3.3. @Indeks Bestille

Da vi gennemgik syntaksen i det foregående afsnit, kan vi også specificere ASC (stigende) og DESC (faldende) værdier efter kolonnenavn. Vi bruger den til at indstille sorteringsrækkefølgen for værdierne i den indekserede kolonne:

@Index (navn = "mulitSortIndex", columnList = "fornavn, efternavn DESC")
[main] DEBUG org.hibernate.SQL - opret indeks mulitSortIndex på Student (fornavn, efternavn desc)

Vi kan specificere rækkefølgen for hver kolonne. Hvis vi ikke gør det, antages den stigende rækkefølge.

3.4. @Indeks Enestående

Den sidste valgfri parameter er a enestående attribut, der definerer, om indekset er unikt. Et unikt indeks sikrer, at de indekserede felter ikke gemmer duplikatværdier. Som standard er det falsk. Hvis vi vil ændre det, kan vi erklære:

@Index (navn = "unikIndex", columnList = "fornavn", unik = sand)
[main] DEBUG org.hibernate.SQL - ændre tabel Student tilføj begrænsning unikIndex unik (fornavn)

Når vi opretter et indeks på den måde, tilføjer vi en unik begrænsning på vores kolonner på samme måde hvordan som en enestående attribut på @Kolonne kommentar gøre. @Indeks har en fordel i forhold til @Kolonne på grund af muligheden for at erklære multi-kolonne unik begrænsning:

@Index (navn = "unikMulitIndex", columnList = "fornavn, efternavn", unik = sand)

3.5. Mange @Indeks på en enkelt enhed

Indtil videre har vi implementeret forskellige varianter af indekset. Selvfølgelig er vi ikke begrænset til at erklære et enkelt indeks for enheden. Lad os indsamle vores erklæringer og specificere hvert enkelt indeks på én gang. Vi gør det ved at gentage @Indeks kommentar i seler og adskilt 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", unik = sand), @Index (navn = "unikMulitIndex", columnList = "fornavn, efternavn", unik = sand)}) offentlig klasse Elevværktøjer Serialiserbare

Desuden kan vi også oprette flere indekser for det samme sæt kolonner.

3.6. Primærnøgle

Når vi taler om indekser, er vi nødt til at stoppe et stykke tid ved primære nøgler. Som vi ved, styres alle enheder af EntityManager skal angive en identifikator, der er kortlagt i den primære nøgle.

Generelt er den primære nøgle en bestemt type unikt indeks. Det er værd at tilføje, at vi ikke behøver at erklære definitionen af ​​denne nøgle på den måde, der blev præsenteret før. Alt sker automatisk af @Id kommentar.

3.7. Ikke-enhed @Indeks

Når vi har lært forskellige måder at implementere indekser på, skal vi nævne det @Bord er ikke det eneste sted at specificere dem. På samme måde kan vi erklære indekser i @SecondaryTable, @CollectionTable, @JoinTable, @TabelGenerator kommentarer. Disse eksempler er ikke dækket af denne artikel. For flere detaljer, se venligst javax.persistence JavaDoc.

4. Konklusion

I denne artikel diskuterede vi deklarering af indekser ved hjælp af JPA. Vi startede med at gennemgå den generelle viden om dem. Senere implementerede vi vores første indeks og gennem eksempler lærte vi at tilpasse det ved at ændre navn, inkluderede kolonner, rækkefølge og unikhed. Til sidst talte vi om primære nøgler og yderligere måder og steder, hvor vi kan erklære dem.

Som altid er eksemplerne fra artiklen tilgængelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found