Bagaimana Anda mendefinisikan bidang, misalnya email
memiliki indeks menggunakan penjelasan JPA. Kami memerlukan kunci non-unik email
karena ada jutaan kueri di bidang ini per hari, dan agak lambat tanpa kuncinya.
@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;
}
Saya telah melihat anotasi khusus hibernasi tetapi saya mencoba menghindari solusi khusus vendor karena kami masih memutuskan antara hibernasi dan datanukleus.
MEMPERBARUI:
Mulai JPA 2.1, Anda dapat melakukan ini. Lihat: Anotasi @Index tidak diizinkan untuk lokasi ini
Jawaban:
Dengan JPA 2.1 Anda seharusnya bisa melakukannya.
Pembaruan : Jika Anda perlu membuat dan mengindeks dengan dua atau lebih kolom, Anda dapat menggunakan koma. Sebagai contoh:
sumber
@Index
anotasi dalam@Table
anotasi? Saya telah mencari di JSR 338 tetapi saya tidak menemukannya di sana. Posting Anda sangat berguna bagi saya.Koleksi unik anotasi Indeks pilihan tangan
= Spesifikasi =
JPA 2.1 +:
javax.persistence.Index
(atau lihat JSR-000.338 . PDF, p 452, Item 11.1.23)The JPA
@Index
penjelasan hanya dapat digunakan sebagai bagian dari penjelasan lain seperti@Table
,@SecondaryTable
, dll .:JDO 2.1+:
javax.jdo.annotations.Index
= ORM Frameworks =
org.hibernate.annotations.Index
;org.apache.openjpa.persistence.jdbc.Index
danorg.apache.openjpa.persistence.jdbc.ElementIndex
(lihat Panduan Referensi );org.eclipse.persistence.annotations.Index
;org.datanucleus.api.jpa.annotations.Index
;com.amazon.carbonado.Index
;org.ujorm.orm.annot.Column
,index
danuniqueIndex
properti;io.requery.Index
;Terkena ( Perpustakaan SQL Kotlin ): org.jetbrains.exposed.sql.Index , org.jetbrains.exposed.sql.Table # index () . Contoh:
= ORM untuk Android =
com.activeandroid.annotation.Column
memilikiindex
,indexGroups
,unique
, danuniqueGroups
sifat;PEMBARUAN [2018]: ActiveAndroid adalah ORM yang bagus 4 tahun yang lalu, tapi sayangnya, penulis pustaka berhenti memeliharanya, jadi seseorang bercabang, memperbaiki bug, dan mengganti namanya menjadi ReActiveAndroid - gunakan ini jika Anda memulai proyek baru atau lihat Panduan Migrasi jika Anda ingin mengganti ActiveAndroid dalam proyek lama.
com.reactiveandroid.annotation.Column
memilikiindex
,indexGroups
,unique
, danuniqueGroups
sifat;com.j256.ormlite.field.DatabaseField
memilikiindex
properti;org.greenrobot.greendao.annotation.Index
;org.orman.mapper.annotation.Index
;com.raizlabs.android.dbflow.sql.index.Index
( contoh penggunaan);= Lainnya (sulit dikategorikan) =
io.realm.annotations.Index
;Pergi saja untuk salah satunya.
sumber
JPA 2.1 (akhirnya) menambahkan dukungan untuk indeks dan kunci asing! Lihat blog ini untuk detailnya. JPA 2.1 adalah bagian dari Java EE 7 yang sudah keluar.
Jika Anda suka hidup di edge, Anda bisa mendapatkan snapshot terbaru untuk eclipselink dari repositori maven mereka (groupId: org.eclipse.persistence, artifactId: eclipselink, versi: 2.5.0-SNAPSHOT). Untuk anotasi JPA saja (yang seharusnya berfungsi dengan penyedia apa pun setelah mendukung 2.1) gunakan artifactID: javax.persistence, versi: 2.1.0-SNAPSHOT.
Saya menggunakannya untuk proyek yang tidak akan selesai sampai setelah rilis, dan saya belum melihat adanya masalah yang mengerikan (walaupun saya tidak melakukan sesuatu yang terlalu rumit dengannya).
UPDATE (26 Sep 2013): Saat ini versi kandidat rilis dan rilis eclipselink tersedia di repositori pusat (utama), jadi Anda tidak perlu lagi menambahkan repositori eclipselink di project Maven. Versi rilis terbaru adalah 2.5.0 tetapi 2.5.1-RC3 juga hadir. Saya akan beralih ke 2.5.1 ASAP karena masalah dengan rilis 2.5.0 (barang modelgen tidak berfungsi).
sumber
Di JPA 2.1 Anda perlu melakukan hal berikut
Dalam contoh di atas, tabel TEST_PERSON akan memiliki 3 indeks:
indeks unik pada ID kunci utama
indeks pada AGE
indeks gabungan di FNAME, SNAME
Catatan 1: Anda mendapatkan indeks majemuk dengan memiliki dua anotasi @Index dengan nama yang sama
Catatan 2: Anda menentukan nama kolom di columnList bukan fieldName
sumber
Saya benar-benar ingin dapat menentukan indeks basis data dengan cara standar tetapi, sayangnya, ini bukan bagian dari spesifikasi JPA (mungkin karena dukungan pembuatan DDL tidak diperlukan oleh spesifikasi JPA, yang merupakan semacam penghalang untuk fitur seperti itu).
Jadi, Anda harus bergantung pada ekstensi khusus penyedia untuk itu. Hibernate, OpenJPA dan EclipseLink jelas menawarkan ekstensi seperti itu. Saya tidak dapat mengonfirmasi untuk DataNucleus tetapi karena definisi indeks adalah bagian dari JDO, saya rasa memang demikian.
Saya sangat berharap dukungan indeks akan distandarisasi dalam versi spesifikasi berikutnya dan dengan demikian entah bagaimana tidak setuju dengan jawaban lain, saya tidak melihat alasan yang baik untuk tidak memasukkan hal seperti itu di JPA (terutama karena database tidak selalu di bawah kendali Anda) untuk dukungan generasi DDL yang optimal.
Omong-omong, saya sarankan mengunduh spesifikasi JPA 2.0.
sumber
Sejauh yang saya tahu, tidak ada cara lintas-Penyedia-JPA untuk menentukan indeks. Namun, Anda selalu dapat membuatnya dengan tangan langsung di database, sebagian besar database akan mengambilnya secara otomatis selama perencanaan kueri.
sumber
javax.persistence.Index
EclipseLink menyediakan anotasi (mis. @Index ) untuk menentukan indeks pada kolom. Ada contohnya penggunaannya. Bagian dari contoh disertakan ...
Bidang firstName dan lastName diindeks, bersama-sama dan satu per satu.
sumber
OpenJPA memungkinkan Anda menentukan anotasi non-standar untuk menentukan indeks pada properti.
Detailnya ada di sini .
sumber
Untuk meringkas jawaban lainnya:
org.hibernate.annotations.Index
org.apache.openjpa.persistence.jdbc.Index
org.eclipse.persistence.annotations.Index
Saya hanya akan memilih salah satu dari mereka. Ini akan datang dengan JPA 2.1 dan seharusnya tidak terlalu sulit untuk diubah jika Anda benar-benar ingin mengganti penyedia JPA Anda.
sumber
Tidak mungkin melakukannya menggunakan anotasi JPA. Dan ini masuk akal: jika UniqueConstraint secara jelas mendefinisikan aturan bisnis, indeks hanyalah cara untuk mempercepat penelusuran. Jadi ini benar-benar harus dilakukan oleh DBA.
sumber
Solusi ini untuk EclipseLink 2.5, dan berfungsi (diuji):
Ini mengasumsikan tatanan ascendant.
sumber