Jak zdefiniujesz pole, np. email
Jako posiadające indeks przy użyciu adnotacji JPA. Potrzebujemy nieunikalnego klucza, email
ponieważ w tym polu dziennie są dosłownie miliony zapytań, a bez klucza jest trochę powolny.
@Entity
@Table(name="person",
uniqueConstraints=@UniqueConstraint(columnNames={"code", "uid"}))
public class Person {
// Unique on code and uid
public String code;
public String uid;
public String username;
public String name;
public String email;
}
Widziałem adnotację specyficzną dla hibernacji, ale staram się unikać rozwiązań specyficznych dla dostawcy, ponieważ wciąż decydujemy między hibernacją a jądrem danych.
AKTUALIZACJA:
Od JPA 2.1 możesz to zrobić. Zobacz: Adnotacja @Index jest niedozwolona w tej lokalizacji
Odpowiedzi:
Z JPA 2.1 powinieneś to zrobić.
Aktualizacja : jeśli kiedykolwiek będziesz musiał tworzyć i indeksować z dwiema lub więcej kolumnami, możesz użyć przecinków. Na przykład:
źródło
@Index
adnotacji w@Table
adnotacji? Szukałem JSR 338, ale go tam nie znalazłem. Twój post jest dla mnie bardzo przydatny.Unikalny, ręcznie wybrany zbiór adnotacji w indeksie
= Dane techniczne =
JPA 2.1+:
javax.persistence.Index
(lub zobaczyć JSR-000338 . PDF, str 452, poz 01.11.23)WZP
@Index
adnotacje mogą być używane tylko jako część innego jak adnotacji@Table
,@SecondaryTable
itp .:JDO 2.1+:
javax.jdo.annotations.Index
= ORM Frameworks =
org.hibernate.annotations.Index
;org.apache.openjpa.persistence.jdbc.Index
iorg.apache.openjpa.persistence.jdbc.ElementIndex
(patrz Przewodnik );org.eclipse.persistence.annotations.Index
;org.datanucleus.api.jpa.annotations.Index
;com.amazon.carbonado.Index
;org.ujorm.orm.annot.Column
,index
iuniqueIndex
właściwości;io.requery.Index
;Exposed ( Kotlin SQL Library): org.jetbrains.exposed.sql.Index , org.jetbrains.exposed.sql.Table # index () . Przykład:
= ORM dla Androida =
com.activeandroid.annotation.Column
zawieraindex
,indexGroups
,unique
iuniqueGroups
właściwości;UPDATE [2018]: ActiveAndroid był fajnym ORMem 4 lata temu, ale niestety autor biblioteki przestał go utrzymywać, więc ktoś rozwidlił, naprawił błędy i przemianował go na ReActiveAndroid - użyj tego, jeśli zaczynasz nowy projekt lub zapoznaj się z Przewodnikiem migracji, jeśli chcesz zastąpić ActiveAndroid w starszym projekcie.
com.reactiveandroid.annotation.Column
maindex
,indexGroups
,unique
, iuniqueGroups
właściwości;com.j256.ormlite.field.DatabaseField
maindex
właściwość;org.greenrobot.greendao.annotation.Index
;org.orman.mapper.annotation.Index
;com.raizlabs.android.dbflow.sql.index.Index
( przykład użycia);= Inne (trudne do skategoryzowania) =
io.realm.annotations.Index
;Po prostu wybierz jedną z nich.
źródło
JPA 2.1 (wreszcie) dodaje obsługę indeksów i kluczy obcych! Zobacz ten blog, aby uzyskać szczegółowe informacje. JPA 2.1 jest częścią Java EE 7, która jest obecnie.
Jeśli lubisz żyć na krawędzi, możesz pobrać najnowszą migawkę dla eclipselink z ich repozytorium maven (groupId: org.eclipse.persistence, artifactId: eclipselink, wersja: 2.5.0-SNAPSHOT). Tylko dla adnotacji JPA (które powinny działać z każdym dostawcą, gdy obsługują 2.1) użyj artifactID: javax.persistence, wersja: 2.1.0-SNAPSHOT.
Używam go do projektu, który nie zostanie ukończony przed jego wydaniem i nie zauważyłem żadnych okropnych problemów (chociaż nie robię z nim nic zbyt skomplikowanego).
AKTUALIZACJA (26 września 2013 r.): Obecnie wersje eclipselink do wydania i wydania kandydatów do wydania są dostępne w centralnym (głównym) repozytorium, więc nie trzeba już dodawać repozytorium eclipselink w projektach Maven. Najnowsza wersja to 2.5.0, ale obecna jest również wersja 2.5.1-RC3. Przerzuciłbym się na 2.5.1 JAK NAJSZYBCIEJ z powodu problemów z wersją 2.5.0 (rzeczy modelgen nie działają).
źródło
W JPA 2.1 musisz wykonać następujące czynności
W powyższym przykładzie tabela TEST_PERSON będzie miała 3 indeksy:
unikalny indeks identyfikatora klucza podstawowego
indeks na AGE
indeks złożony na FNAME, SNAME
Uwaga 1: Indeks złożony uzyskuje się, mając dwie adnotacje @Index o tej samej nazwie
Uwaga 2: Nazwę kolumny określasz w columnList, a nie w fieldName
źródło
Naprawdę chciałbym móc określić indeksy bazy danych w ustandaryzowany sposób, ale niestety nie jest to częścią specyfikacji JPA (może dlatego, że specyfikacja JPA nie wymaga obsługi generacji DDL, co jest rodzajem blokady drogowej dla taka funkcja).
Musisz więc polegać na rozszerzeniu specyficznym dla dostawcy. Hibernate, OpenJPA i EclipseLink wyraźnie oferują takie rozszerzenie. Nie mogę potwierdzić dla DataNucleus, ale ponieważ definicja indeksów jest częścią JDO, myślę, że tak.
Naprawdę mam nadzieję, że obsługa indeksu zostanie ustandaryzowana w kolejnych wersjach specyfikacji i tym samym jakoś nie będzie się zgadzać z innymi odpowiedziami, nie widzę żadnego powodu, aby nie umieszczać czegoś takiego w JPA (zwłaszcza, że baza danych nie zawsze jest pod twoją kontrolą) dla optymalnej obsługi generacji DDL.
Przy okazji sugeruję pobranie specyfikacji JPA 2.0.
źródło
O ile mi wiadomo, nie istnieje sposób określania indeksów przez dostawców między JPA. Jednak zawsze możesz utworzyć je ręcznie bezpośrednio w bazie danych, większość baz danych pobierze je automatycznie podczas planowania zapytań.
źródło
javax.persistence.Index
EclipseLink dostarczył adnotację (np. @Index ) w celu zdefiniowania indeksu w kolumnach. Oto przykład jego użycia. Część przykładu jest dołączona ...
Pola firstName i lastName są indeksowane razem i indywidualnie.
źródło
OpenJPA umożliwia określenie niestandardowych adnotacji w celu zdefiniowania indeksu właściwości.
Szczegóły tutaj .
źródło
Podsumowując pozostałe odpowiedzi:
org.hibernate.annotations.Index
org.apache.openjpa.persistence.jdbc.Index
org.eclipse.persistence.annotations.Index
Po prostu wybrałbym jednego z nich. I tak będzie dostarczany z JPA 2.1 i nie powinien być zbyt trudny do zmiany w przypadku, gdy naprawdę chcesz zmienić dostawcę JPA.
źródło
Nie można tego zrobić za pomocą adnotacji JPA. I to ma sens: gdy UniqueConstraint jasno definiuje reguły biznesowe, indeks jest tylko sposobem na przyspieszenie wyszukiwania. Więc powinno to być naprawdę zrobione przez administratora.
źródło
To rozwiązanie jest dla EclipseLink 2.5 i działa (przetestowane):
Zakłada to kolejność rosnącą.
źródło