Definiranje indeksa u JPA

1. Uvod

U ovom uputstvu ćemo razgovarati definiranje indeksa pomoću JPA-a @Indeks bilješka. Kroz primjere ćemo naučiti kako definirati svoj prvi indeks pomoću JPA i Hibernate. Nakon toga izmijenit ćemo definiciju koja pokazuje dodatne načine prilagodbe indeksa.

2. @Indeks Bilješka

Počnimo s brzim sažetkom. Indeks baze podataka je struktura podataka koja poboljšava brzinu operacija pronalaženja podataka na tablici po cijenu dodatnog prostora za pisanje i pohranu. Uglavnom je kopija odabranih stupaca podataka iz jedne tablice. Trebali bismo stvoriti indekse kako bismo povećali izvedbu na našem postojanom sloju.

JPA nam omogućuje da to postignemo definiranjem indeksa iz našeg koda @Indeks. Ova se napomena tumači postupkom generiranja sheme, automatski stvarajući artefakte. Imajte na umu da nije potrebno navesti bilo koji indeks za naše entitete.

Pogledajmo sada definiciju.

2.1. javax.postojanost.Index

Podrška indeksu konačno je dodana u specifikaciju JPA 2.1 od strane javax.postojanost.Index. Ovom napomenom definirajmo indeks za našu tablicu i prilagodimo ga u skladu s tim:

@Target ({}) @Retention (RUNTIME) public @interface Index {String name () default ""; Niz stringList (); boolean unique () zadana vrijednost false; }

Kao što vidimo, samo stupacPopis atribut je obvezan, što moramo definirati. Kasnije ćemo bolje pregledati svaki od parametara, prolazeći kroz primjere.

2.2. JPA protiv hibernacije

Znamo da je JPA samo specifikacija. Da bismo ispravno radili, također moramo odrediti pružatelja trajnosti. Prema zadanim postavkama Hibernate Framework je JPA-ina implementacija koju je donijelo proljeće. Više o tome možete pročitati ovdje.

Trebali bismo se sjetiti da je podrška za indeks dodana JPA-i vrlo kasno. Prije toga mnogi ORM Frameworks podržavaju indekse uvođenjem vlastite prilagođene implementacije, koja bi mogla raditi drugačije. Hibernate Framework također je to učinio i predstavio org.hibernate.annotations.Index bilješka. Dok radimo s tim okvirom, moramo biti oprezni da je zastario od podrške za specifikaciju JPA 2.1, te bismo trebali koristiti onaj JPA-e.

Sad kad imamo tehničku podlogu, možemo proći kroz primjere i definirati svoj prvi indeks u JPA.

3. Utvrđivanje @Indeks

U ovom smo odjeljku implementirali naš indeks. Kasnije ćemo ga pokušati izmijeniti, predstavljajući različite mogućnosti prilagodbe.

Prije nego što započnemo, moramo pravilno inicijalizirati svoj projekt i definirati model.

Provedimo a Student entitet:

@Entity @Table javna klasa Student implementira serializable {@Id @GeneratedValue private Long id; private String firstName; private String lastName; // geteri, postavljači}

Kad imamo svoj model, provedimo prvi indeks. Sve što moramo učiniti je dodati znak @Indeks bilješka. To radimo u @Stol bilješka pod indeksi atribut. Sjetimo se navesti naziv stupca:

@Tabela (indeksi = @Index (columnList = "firstName"))

Proglasili smo prvi indeks pomoću ime stupac. Kada izvršimo postupak stvaranja sheme, možemo ga provjeriti:

[glavna] DEBUG org.hibernate.SQL - izradite indeks IDX2gdkcjo83j0c2svhvceabnnoh na studentu (firstName)

Sada je vrijeme da izmijenimo našu izjavu koja pokazuje dodatne značajke.

3.1. @Indeks Ime

Kao što vidimo, naš indeks mora imati ime. Prema zadanim postavkama, ako to ne odredimo, to je vrijednost koju generira davatelj usluga. Kada želimo imati prilagođenu oznaku, jednostavno bismo trebali dodati znak Ime atribut:

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

Ova varijanta stvara indeks s korisničkim imenom:

[glavna] DEBUG org.hibernate.SQL - stvoriti indeks fn_index na studentu (firstName)

Štoviše, svoj indeks možemo stvoriti u različitoj shemi navodeći ime sheme u Ime:

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

3.2. Višestupac @Indeks

Pogledajmo sada pobliže stupacPopis sintaksa:

stupac :: = stupac_indeksa [, stupac_indeksa] * stupac_indeksa :: = naziv_stupca [ASC | DESC]

Kao što već znamo, možemo odrediti imena stupaca koja će biti uključena u indeks. Naravno, za jedan indeks možemo odrediti više stupaca. To radimo razdvajanjem imena zarezom:

@Index (name = "mulitIndex1", columnList = "firstName, lastName") @Index (name = "mulitIndex2", columnList = "lastName, firstName")
[main] DEBUG org.hibernate.SQL - stvoriti indeks mulitIndex1 na Studentu (firstName, lastName) [main] DEBUG org.hibernate.SQL - stvoriti index mulitIndex2 na Studentu (lastName, firstName)

Imajte na umu da pružatelj trajnosti mora poštivati ​​navedeni redoslijed stupaca. U našem se primjeru indeksi malo razlikuju, čak i ako određuju isti skup stupaca.

3.3. @Indeks Narudžba

Kao što smo pregledali sintaksu u prethodnom odjeljku, također možemo odrediti ASC (uzlazno) i DESC (silazne) vrijednosti nakon ime_stupaca. Koristimo ga za postavljanje redoslijeda sortiranja vrijednosti u indeksiranom stupcu:

@Index (name = "mulitSortIndex", columnList = "firstName, lastName DESC")
[glavna] DEBUG org.hibernate.SQL - stvoriti indeks mulitSortIndex na učeniku (ime, prezime opis)

Za svaki stupac možemo odrediti redoslijed. Ako to ne učinimo, pretpostavlja se rastući poredak.

3.4. @Indeks Jedinstvenost

Posljednji neobavezni parametar je a jedinstven atribut, koji definira je li indeks jedinstven. Jedinstveni indeks osigurava da indeksirana polja ne pohranjuju dvostruke vrijednosti. Po defaultu je lažno. Ako ga želimo promijeniti, možemo izjaviti:

@Index (name = "uniqueIndex", columnList = "firstName", unique = true)
[glavna] DEBUG org.hibernate.SQL - promijeni tablicu Student doda ograničenje uniqueIndex unique (firstName)

Kada na taj način kreiramo indeks, na naše stupce dodamo ograničenje jedinstvenosti, slično tome, kao jedinstven atribut na @Stupac bilješka učiniti. @Indeks ima prednost nad @Stupac zbog mogućnosti deklariranja jedinstvenog ograničenja s više stupaca:

@Index (name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)

3.5. Višestruko @Indeks na jednom entitetu

Do sada smo implementirali različite varijante indeksa. Naravno, nismo ograničeni na deklariranje jednog indeksa na entitetu. Prikupimo naše deklaracije i odredimo svaki pojedini indeks odjednom. To radimo ponavljanjem @Indeks napomena u zagradama i odvojena zarezom:

@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 = "firstName", unique = true), @Index (name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)}) javna klasa Student implementira Serializable

Štoviše, možemo stvoriti više indeksa za isti skup stupaca.

3.6. Osnovni ključ

Kad govorimo o indeksima, moramo se zaustaviti na neko vrijeme kod primarnih ključeva. Kao što znamo, svaki entitet kojim upravlja EntityManager mora navesti identifikator koji se preslikava u primarni ključ.

Općenito, primarni ključ je određena vrsta jedinstvenog indeksa. Vrijedno je dodati da definiciju ovog ključa ne moramo deklarirati na način predstavljen prije. Sve automatski radi @Iskaznica bilješka.

3.7. Ne-entitet @Indeks

Nakon što smo naučili različite načine implementacije indeksa, to bismo trebali spomenuti @Stol nije jedino mjesto za njihovo specificiranje. Na isti način indekse možemo prijaviti u @SecondaryTable, @CollectionTable, @JoinTable, @TableGenerator bilješke. Ti primjeri nisu obrađeni u ovom članku. Za više detalja, molimo provjerite javax.postojanost JavaDoc.

4. Zaključak

U ovom smo članku razgovarali o deklariranju indeksa pomoću JPA. Započeli smo s pregledom općeg znanja o njima. Kasnije smo implementirali svoj prvi indeks i kroz primjere naučili kako ga prilagoditi promjenom imena, uključenih stupaca, redoslijeda i jedinstvenosti. Na kraju smo razgovarali o primarnim ključevima i dodatnim načinima i mjestima na kojima ih možemo prijaviti.

Kao i uvijek, primjeri iz članka dostupni su na GitHubu.


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