1. 程式人生 > >我主要負責轉載優秀的技術博文

我主要負責轉載優秀的技術博文

如何定義一個欄位,例如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 ORMorg.hibernate.annotations.Index;

  • OpenJPAorg.apache.openjpa.persistence.jdbc.Index;

  • EclipseLinkorg.eclipse.persistence.annotations.Index;

  • DataNucleusorg.datanucleus.api.jpa.annotations.Index;

  • Carbonado (GitHub)com.amazon.carbonado.Index;

  • EBeancom.avaje.ebean.annotation.Index;

  • Ujorm:註釋org.ujorm.orm.annot.ColumnindexuniqueIndex性質;

  • 請求(GitHub):註釋io.requery.Index;

  • ActiveAndroid:註釋com.activeandroid.annotation.Column具有indexindexGroupsuniqueuniqueGroups性質;

  • ORMLite:註釋com.j256.ormlite.field.DatabaseField具有index性質;

  • greenDAOde.greenrobot.daogenerator.Index;

  • ORMAN (GitHub)org.orman.mapper.annotation.Index;

  • ★DBFlow (GitHub)com.raizlabs.android.dbflow.sql.index.Index(example的用法);

  • other

=其他(難以分類)=

  • 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;