我主要負責轉載優秀的技術博文
如何定義一個欄位,例如email
具有使用JPA註釋的索引。我們在email
上需要一個non-unique金鑰,因為這個欄位每天都有數以百萬計的查詢,並且沒有金鑰有點慢。
@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;
}
我已經看到了一個hibernate特定的註釋,但是我正在嘗試避免供應商的具體解決方案,因為我們仍然在hibernate和datanucleus之間作出決定。
更新:
最佳解決方案
據我所知,沒有一個指定索引的cross-JPA-Provider方式。但是,您可以隨時直接在資料庫中建立它們,大多數資料庫將在查詢計劃期間自動選擇它們。
次佳解決方案
使用JPA 2.1,您應該能夠做到。
import javax.persistence.Column;
import javax.persistence .Entity;
import javax.persistence.Index;
import javax.persistence.Table;
@Entity
@Table(name = "region",
indexes = {@Index(name = "my_index_name", columnList="iso_code", unique = true),
@Index(name = "my_index_name2", columnList="name", unique = false)})
public class Region{
@Column (name = "iso_code", nullable = false)
private String isoCode;
@Column(name = "name", nullable = false)
private String name;
}
更新:如果您需要使用兩個或更多列建立和索引,可以使用逗號。例如:
@Entity
@Table(name = "company__activity",
indexes = {@Index(name = "i_company_activity", columnList = "activity_id,company_id")})
public class CompanyActivity{
第三種解決方案
JPA 2.1(最後)增加了索引和外來鍵的支援!有關詳細資訊,請參閱this blog。 JPA 2.1是Java EE 7的一部分。
如果您喜歡生活在邊,您可以從他們的maven repository(groupId:org.eclipse.persistence,artifactId:eclipselink,version:2.5.0-SNAPSHOT)獲取eclipselink的最新快照。對於只有JPA註釋(它們在支援2.1之後應該與任何提供者一起工作)使用artifactID:javax.persistence,version:2.1.0-SNAPSHOT。
我正在使用它的專案,直到釋放後才會完成,我沒有注意到任何可怕的問題(儘管我沒有做任何事情太複雜)。
更新(2013年9月26日):如今,中央(主)儲存庫中可以釋出和釋出eclipselink的候選版本,因此您不再需要在Maven專案中新增eclipselink儲存庫。最新版本是2.5.0,但2.5.1-RC3也是存在的。由於2.5.0版本的問題(模型源不起作用),我將切換到2.5.1 ASAP。
第四種方案
索引註釋的獨特的hand-picked集合
=規格=
-
JPA 2.1+:
javax.persistence.Index
(或參見JSR-000338,第450頁,第11.1.23條)JPA@Index
註釋只能用作另一註釋的一部分,如@Table
,@SecondaryTable
等。@Table(indexes = { @Index(...) })
-
JDO 2.1+:
javax.jdo.annotations.Index
= ORM框架=
-
♥Hibernate ORM:
org.hibernate.annotations.Index
; -
OpenJPA:
org.apache.openjpa.persistence.jdbc.Index
; -
EclipseLink:
org.eclipse.persistence.annotations.Index
; -
DataNucleus:
org.datanucleus.api.jpa.annotations.Index
; -
Carbonado (GitHub):
com.amazon.carbonado.Index
; -
EBean:
com.avaje.ebean.annotation.Index
; -
Ujorm:註釋
org.ujorm.orm.annot.Column
,index
和uniqueIndex
性質; -
請求(GitHub):註釋
io.requery.Index
;
-
♥ActiveAndroid:註釋
com.activeandroid.annotation.Column
具有index
,indexGroups
,unique
和uniqueGroups
性質; -
ORMLite:註釋
com.j256.ormlite.field.DatabaseField
具有index
性質; -
greenDAO:
de.greenrobot.daogenerator.Index
; -
ORMAN (GitHub):
org.orman.mapper.annotation.Index
; -
★DBFlow (GitHub):
com.raizlabs.android.dbflow.sql.index.Index
(example的用法);
=其他(難以分類)=
-
Realm – iOS /Android的備用資料庫:註釋
io.realm.annotations.Index
; -
Empire-db – 一個基於JDBC的輕量級但強大的關係資料庫抽象層。它通過註釋沒有模式定義;
-
Kotlin NoSQL (GitHub) – 用於與NoSQL資料庫(PoC)一起工作的反應性和type-safe DSL:?
只要去其中一個。
第五種方案
我真的希望能夠以標準化的方式指定資料庫索引,但可惜的是,這不是JPA規範的一部分(可能是因為JPA規範不需要DDL生成支援,這是JPA規範中的一種路徑這樣的特徵)。
所以你必須依賴一個提供者特定的擴充套件。 Hibernate,OpenJPA和EclipseLink清楚地提供了這樣的擴充套件。我無法確認DataNucleus,但由於索引定義是JDO的一部分,我猜這是。
我真的希望索引支援將在下一個版本的規範中得到標準化,從而不同意其他答案,我沒有看到有什麼好的理由不在JPA中包含這樣的事情(特別是因為資料庫並不總是在你的控制之下)以獲得最佳的DDL生成支援。
順便說一下,我建議下載JPA 2.0規範。
第六種方案
在JPA 2.1中,您需要執行以下操作
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Table;
@Entity(name="TEST_PERSON")
@Table(
name="TEST_PERSON",
indexes = {
@Index(name = "PERSON_INDX_0", columnList = "age"),
@Index(name = "PERSON_INDX_1", columnList = "fName"),
@Index(name = "PERSON_INDX_1", columnList = "sName") })
public class TestPerson {
@Column(name = "age", nullable = false)
private int age;
@Column(name = "fName", nullable = false)
private String firstName;
@Column(name = "sName", nullable = false)
private String secondName;
@Id
private long id;
public TestPerson() {
}
}
在上面的例子中,表TEST_PERSON將有3個索引:
-
主鍵ID上的唯一索引
-
AGE指數
-
FNAME,SNAME上的複合索引
注1:通過使用相同名稱的兩個@Index註釋來獲得化合物索引
注2:在columnList中指定列名稱而不是fieldName
==============================================================
可以為空、精度15位、保留2位小數
@
Column
(nullable
=
true
,
precision
=
15, scale = 2)
private BigDecimal xxxx;