Wie definieren Sie ein Feld, z. B. email
als Index mit JPA-Anmerkungen? Wir benötigen einen nicht eindeutigen Schlüssel, email
da in diesem Feld buchstäblich Millionen von Abfragen pro Tag ausgeführt werden und es ohne den Schlüssel etwas langsam ist.
@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;
}
Ich habe eine Annotation im Ruhezustand gesehen, aber ich versuche, herstellerspezifische Lösungen zu vermeiden, da wir uns immer noch zwischen Ruhezustand und Datenkern entscheiden.
AKTUALISIEREN:
Ab JPA 2.1 können Sie dies tun. Siehe: Die Anmerkung @Index ist für diesen Speicherort nicht zulässig
Antworten:
Mit JPA 2.1 sollten Sie dazu in der Lage sein.
Update : Wenn Sie jemals zwei oder mehr Spalten erstellen und indizieren müssen, können Sie Kommas verwenden. Beispielsweise:
quelle
@Index
Anmerkung in der@Table
Anmerkung finden kann? Ich habe nach JSR 338 gesucht, aber dort nicht gefunden. Ihr Beitrag ist sehr nützlich für mich.Eine einzigartige handverlesene Sammlung von Indexanmerkungen
= Technische Daten =
JPA 2.1+:
javax.persistence.Index
(oder siehe JSR-000338 . PDF, S. 452, Punkt 11.1.23)Die JPA -
@Index
Annotation nur als Teil einer anderen Anmerkung wie verwendet werden kann@Table
,@SecondaryTable
usw .:JDO 2.1+:
javax.jdo.annotations.Index
= ORM Frameworks =
org.hibernate.annotations.Index
;org.apache.openjpa.persistence.jdbc.Index
undorg.apache.openjpa.persistence.jdbc.ElementIndex
(siehe Referenzhandbuch );org.eclipse.persistence.annotations.Index
;org.datanucleus.api.jpa.annotations.Index
;com.amazon.carbonado.Index
;org.ujorm.orm.annot.Column
,index
unduniqueIndex
Eigenschaften;io.requery.Index
;Exposed ( Kotlin SQL Library): org.jetbrains.exposed.sql.Index , org.jetbrains.exposed.sql.Table # index () . Beispiel:
= ORM für Android =
com.activeandroid.annotation.Column
hatindex
,indexGroups
,unique
, unduniqueGroups
Eigenschaften;UPDATE [2018]: ActiveAndroid war vor 4 Jahren ein nettes ORM, aber leider hat der Autor der Bibliothek die Wartung eingestellt, sodass jemand Fehler gab und sie in ReActiveAndroid umbenannte. Verwenden Sie diese Option , wenn Sie ein neues Projekt starten oder siehe Handbuch für die Migration , wenn Sie in einem Legacy - Projekt ersetzen ActiveAndroid wollen.
com.reactiveandroid.annotation.Column
hatindex
,indexGroups
,unique
, unduniqueGroups
Eigenschaften;com.j256.ormlite.field.DatabaseField
hat eineindex
Eigenschaft;org.greenrobot.greendao.annotation.Index
;org.orman.mapper.annotation.Index
;com.raizlabs.android.dbflow.sql.index.Index
( Beispiel der Verwendung);= Andere (schwer zu kategorisieren) =
io.realm.annotations.Index
;Gehen Sie einfach für einen von ihnen.
quelle
JPA 2.1 bietet (endlich) Unterstützung für Indizes und Fremdschlüssel! Weitere Informationen finden Sie in diesem Blog . JPA 2.1 ist ein Teil von Java EE 7, das nicht verfügbar ist.
Wenn Sie gerne am Rande leben, können Sie den neuesten Snapshot für Eclipselink aus dem Maven-Repository abrufen (groupId: org.eclipse.persistence, artefaktId: eclipselink, Version: 2.5.0-SNAPSHOT). Verwenden Sie nur für die JPA-Annotationen (die mit jedem Anbieter funktionieren sollten, sobald dieser 2.1 unterstützt) die Artefakt-ID: javax.persistence, Version: 2.1.0-SNAPSHOT.
Ich verwende es für ein Projekt, das erst nach seiner Veröffentlichung abgeschlossen wird, und ich habe keine schrecklichen Probleme bemerkt (obwohl ich nichts zu komplexes damit mache).
UPDATE (26. September 2013): Heutzutage sind Release- und Release Candidate-Versionen von Eclipselink im zentralen (Haupt-) Repository verfügbar, sodass Sie das Eclipselink-Repository in Maven-Projekten nicht mehr hinzufügen müssen. Die neueste Release-Version ist 2.5.0, aber auch 2.5.1-RC3 ist vorhanden. Ich würde wegen Problemen mit der Version 2.5.0 so schnell wie möglich auf 2.5.1 umsteigen (das modelgen-Zeug funktioniert nicht).
quelle
In JPA 2.1 müssen Sie Folgendes tun
Im obigen Beispiel hat die Tabelle TEST_PERSON 3 Indizes:
eindeutiger Index für die Primärschlüssel-ID
Index auf Alter
zusammengesetzter Index auf FNAME, SNAME
Hinweis 1: Sie erhalten den zusammengesetzten Index, indem Sie zwei @ Index-Annotationen mit demselben Namen haben
Hinweis 2: Sie geben den Spaltennamen in der Spaltenliste an, nicht den Feldnamen
quelle
Ich würde wirklich gerne in der Lage sein, Datenbankindizes auf standardisierte Weise anzugeben, aber leider ist dies nicht Teil der JPA-Spezifikation (möglicherweise, weil die JPA-Spezifikation keine Unterstützung für die DDL-Generierung erfordert, was eine Art Straßensperre für ist eine solche Funktion).
Dafür müssen Sie sich auf eine anbieterspezifische Erweiterung verlassen. Hibernate, OpenJPA und EclipseLink bieten eindeutig eine solche Erweiterung. Ich kann DataNucleus nicht bestätigen, aber da die Indexdefinition Teil von JDO ist, denke ich, dass dies der Fall ist.
Ich hoffe wirklich, dass die Indexunterstützung in den nächsten Versionen der Spezifikation standardisiert wird und daher irgendwie nicht mit anderen Antworten übereinstimmt. Ich sehe keinen guten Grund, so etwas nicht in JPA aufzunehmen (zumal die Datenbank nicht immer unter Ihrer Kontrolle steht). für optimale Unterstützung der DDL-Generierung.
Ich schlage übrigens vor, die JPA 2.0-Spezifikation herunterzuladen.
quelle
Soweit ich weiß, gibt es keine JPA-Provider-übergreifende Möglichkeit, Indizes anzugeben. Sie können sie jedoch jederzeit von Hand direkt in der Datenbank erstellen. Die meisten Datenbanken übernehmen sie automatisch während der Abfrageplanung.
quelle
javax.persistence.Index
EclipseLink hat eine Anmerkung (z. B. @Index ) bereitgestellt , um einen Index für Spalten zu definieren. Es gibt ein Beispiel für seine Verwendung. Ein Teil des Beispiels ist enthalten ...
Die Felder firstName und lastName werden zusammen und einzeln indiziert.
quelle
Mit OpenJPA können Sie nicht standardmäßige Anmerkungen angeben, um den Index für die Eigenschaft zu definieren.
Details finden Sie hier .
quelle
Um die anderen Antworten zusammenzufassen:
org.hibernate.annotations.Index
org.apache.openjpa.persistence.jdbc.Index
org.eclipse.persistence.annotations.Index
Ich würde einfach für einen von ihnen gehen. Es wird sowieso mit JPA 2.1 geliefert und sollte nicht zu schwer zu ändern sein, falls Sie wirklich Ihren JPA-Anbieter wechseln möchten.
quelle
Dies ist mit der JPA-Annotation nicht möglich. Und das ist sinnvoll: Wenn eine UniqueConstraint Geschäftsregeln klar definiert, ist ein Index nur eine Möglichkeit, die Suche zu beschleunigen. Das sollte also wirklich von einem DBA gemacht werden.
quelle
Diese Lösung ist für EclipseLink 2.5 und funktioniert (getestet):
Dies setzt eine aufsteigende Reihenfolge voraus.
quelle