Definovanie indexov v JPA

1. Úvod

V tomto výučbe si povieme niečo o tom definovanie indexov pomocou JPA @Index anotácia. Na príkladoch sa dozvieme, ako definovať náš prvý index pomocou JPA a Hibernate. Potom upravíme definíciu, ktorá ukazuje ďalšie spôsoby prispôsobenia indexu.

2. @Index Anotácia

Začnime rýchlou rekapituláciou. Databázový index je a dátová štruktúra, ktorá zvyšuje rýchlosť operácií načítania údajov v tabuľke za cenu ďalších zápisov a úložného priestoru. Väčšinou je to a kópia vybraných stĺpcov údajov z jednej tabuľky. Mali by sme vytvoriť indexy na zvýšenie výkonu našej vrstvy perzistencie.

JPA nám to umožňuje dosiahnuť definovaním indexov z nášho kódu pomocou @Index. Táto anotácia je interpretovaná procesom generovania schémy, pričom sa artefakty vytvárajú automaticky. Upozorňujeme, že pre naše entity nie je potrebné špecifikovať žiadny index.

Poďme sa teraz pozrieť na definíciu.

2.1. javax.persistence.Index

Podpora indexov bola konečne pridaná do špecifikácie JPA 2.1 používateľom javax.persistence.Index. Táto anotácia nám umožňuje definovať index pre našu tabuľku a podľa toho ju prispôsobiť:

@Target ({}) @Retention (RUNTIME) public @interface Index {Názov reťazca () predvolené ""; Reťazec columnList (); boolean unique () predvolená hodnota false; }

Ako vidíme, iba columnList atribút je povinný, čo musíme definovať. Neskôr sa podrobnejšie pozrieme na každý z parametrov a ukážeme si príklady.

2.2. JPA vs. Hibernate

Vieme, že JPA je iba špecifikácia. Aby sme správne fungovali, musíme tiež určiť poskytovateľa perzistencie. Implicitne je Hibernate Framework implementácia JPA doručená na jar. Viac o tom sa dočítate tu.

Mali by sme pamätať na to, že podpora indexov bola do Spoločného parlamentného zhromaždenia pridaná veľmi neskoro. Predtým mnoho rámcov ORM podporuje indexy zavedením vlastnej prispôsobenej implementácie, ktorá môže fungovať inak. Urobil to aj rámec dlhodobého spánku a predstavil org.hibernate.annotations.Index anotácia. Pri práci s týmto rámcom musíme byť opatrní, že je zastaraný od podpory špecifikácie JPA 2.1, a mali by sme použiť ten JPA.

Teraz, keď máme nejaké technické zázemie, si môžeme prejsť príkladmi a definovať náš prvý index v JPA.

3. Definovanie @Index

V tejto časti implementujeme náš index. Neskôr sa to pokúsime upraviť a predstavíme rôzne možnosti prispôsobenia.

Predtým, ako začneme, musíme správne inicializovať náš projekt a definovať model.

Implementujme a Študent subjekt:

@Entity @Table public class Študent implementuje Serializable {@Id @GeneratedValue private Long id; private String meno; private String priezvisko; // zakladatelia, zakladatelia}

Keď máme náš model, implementujme prvý index. Všetko, čo musíme urobiť, je pridať znak @Index anotácia. Robíme to v @ Tabuľka anotácia pod indexy atribút. Nezabudnite uviesť názov stĺpca:

@Table (indexes = @Index (columnList = "firstName"))

Prvý index sme deklarovali pomocou krstné meno stĺpec. Keď vykonáme proces vytvorenia schémy, môžeme ho overiť:

[main] DEBUG org.hibernate.SQL - vytvoriť index IDX2gdkcjo83j0c2svhvceabnnoh na študentovi (meno)

Teraz je čas upraviť našu deklaráciu zobrazujúcu ďalšie funkcie.

3.1. @Index názov

Ako vidíme, náš index musí mať názov. Ak to neurčíme predvolene, jedná sa o hodnotu generovanú poskytovateľom. Ak chceme mať vlastný štítok, mali by sme jednoducho pridať znak názov atribút:

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

Tento variant vytvára index s používateľom definovaným názvom:

[main] DEBUG org.hibernate.SQL - vytvoriť index fn_index pre študenta (meno)

Okrem toho môžeme vytvoriť náš index v inej schéme zadaním názvu schémy v názov:

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

3.2. Viacstĺpcový @Index

Poďme sa teraz bližšie pozrieť na columnList syntax:

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

Ako už vieme, môžeme určiť názvy stĺpcov, ktoré sa majú zahrnúť do indexu. Samozrejme, do jedného indexu môžeme určiť viac stĺpcov. Robíme to tak, že mená oddelíme čiarkou:

@Index (name = "mulitIndex1", columnList = "meno, priezvisko") @Index (name = "mulitIndex2", columnList = "priezvisko, meno")
[main] DEBUG org.hibernate.SQL - vytvorenie indexu mulitIndex1 na študentovi (meno, priezvisko) [main] DEBUG org.hibernate.SQL - vytvorenie indexu mulitIndex2 na študenta (priezvisko, meno)

Upozorňujeme, že poskytovateľ perzistencie musí dodržiavať zadané usporiadanie stĺpcov. V našom príklade sa indexy mierne líšia, aj keď určujú rovnakú skupinu stĺpcov.

3.3. @Index objednať

Keď sme si prezerali syntax v predchádzajúcej časti, môžeme tiež určiť ASC (vzostupne) a POPIS (zostupne) hodnoty po názov_sloupca. Používame ho na nastavenie poradia triedenia hodnôt v indexovanom stĺpci:

@Index (name = "mulitSortIndex", columnList = "meno, priezvisko DESC")
[main] DEBUG org.hibernate.SQL - vytvoriť index mulitSortIndex pre študenta (meno, priezvisko)

Pre každý stĺpec môžeme určiť poradie. Ak to neurobíme, predpokladá sa vzostupné poradie.

3.4. @Index Jedinečnosť

Posledný voliteľný parameter je a jedinečný atribút, ktorý definuje, či je index jedinečný. Jedinečný index zaisťuje, že indexované polia neukladajú duplicitné hodnoty. V predvolenom nastavení je nepravdivé. Ak to chceme zmeniť, môžeme vyhlásiť:

@Index (name = "uniqueIndex", columnList = "firstName", unique = true)
[main] DEBUG org.hibernate.SQL - zmeniť tabuľku Študent pridať obmedzenie uniqueIndex unique (meno)

Keď takýmto spôsobom vytvoríme index, pridáme do svojich stĺpcov obmedzenie jedinečnosti, podobne ako a jedinečný atribút zapnutý @ Stĺpec anotácia robiť. @Index má výhodu oproti @ Stĺpec z dôvodu možnosti vyhlásiť jedinečné obmedzenie pre viac stĺpcov:

@Index (name = "uniqueMulitIndex", columnList = "meno, priezvisko", unique = true)

3.5. Viacnásobné @Index na jednom subjekte

Zatiaľ sme implementovali rôzne varianty indexu. Samozrejme, neobmedzujeme sa iba na vyhlásenie jediného indexu za entitu. Pozbierajme svoje vyhlásenia a určme každý index naraz. Robíme to opakovaním @Index anotácia v zložených zátvorkách a oddelená čiarkou:

@Entity @Table (indexes = {@Index (columnList = "firstName"), @Index (name = "fn_index", columnList = "firstName"), @Index (name = "mulitIndex1", columnList = "meno, priezvisko" ), @Index (name = "mulitIndex2", columnList = "priezvisko, meno"), @Index (name = "mulitSortIndex", columnList = "meno, priezvisko DESC"), @Index (name = "uniqueIndex", columnList =) „firstName“, unique = true), @Index (name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)}) verejná trieda Student implementuje Serializable

A čo viac, môžeme vytvoriť aj viac indexov pre rovnakú skupinu stĺpcov.

3.6. Primárny kľúč

Keď hovoríme o indexoch, musíme sa na chvíľu zastaviť pri primárnych kľúčoch. Ako vieme, každý subjekt spravovaný EntityManager musíte určiť identifikátor, ktorý je namapovaný na primárny kľúč.

Primárny kľúč je spravidla špecifický typ jedinečného indexu. Je potrebné dodať, že definíciu tohto kľúča nemusíme deklarovať spôsobom, ktorý sme uviedli predtým. Všetko robí automaticky @Id anotácia.

3.7. Non-entity @Index

Keď sme sa naučili rôzne spôsoby implementácie indexov, mali by sme to spomenúť @ Tabuľka nie je jediným miestom na ich špecifikáciu. Rovnakým spôsobom môžeme deklarovať indexy v @SecondaryTable, @CollectionTable, @JoinTable, @TableGenerator anotácie. Týmto príkladom sa tento článok nezaoberá. Ďalšie informácie nájdete na stránke javax.perzistencia JavaDoc.

4. Záver

V tomto článku sme diskutovali o deklarovaní indexov pomocou JPA. Začali sme preskúmaním všeobecných poznatkov o nich. Neskôr sme implementovali náš prvý index a prostredníctvom príkladov sme sa naučili, ako ho prispôsobiť zmenou názvu, zahrnutých stĺpcov, poradia a jedinečnosti. Na záver sme hovorili o primárnych kľúčoch a ďalších spôsoboch a miestach, kde ich môžeme deklarovať.

Príklady z článku sú ako vždy k dispozícii na GitHub.


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