在JPA中定義索引

1.簡介

在本教程中,我們將討論使用JPA的@Index註釋定義索引。通過示例,我們將學習如何使用JPA和Hibernate定義第一個索引。之後,我們將修改定義,以顯示其他定制索引的方法。

2. @Index註釋

讓我們從快速回顧開始。數據庫索引是一種數據結構,它以增加的寫入和存儲空間為代價,提高了對錶進行數據檢索操作的速度。通常,它是從單個表中選擇的數據列的副本。我們應該創建索引來提高持久層的性能。

@Index從代碼中定義索引來實現這一點。該註釋由模式生成過程解釋,並自動創建工件。請注意,沒有必要為我們的實體指定任何索引。

現在,讓我們看一下定義。

2.1。 javax.persistence.Index

javax.persistence.Index在JPA 2.1規範中添加了對索引的支持。該註釋使我們可以為表定義索引並相應地對其進行自定義:

@Target({})

 @Retention(RUNTIME)

 public @interface Index {

 String name() default "";

 String columnList();

 boolean unique() default false;

 }

如我們所見,只有columnList屬性是必需的,我們必須對其進行定義。我們將在後面的示例中對每個參數進行更好地研究。

2.2。 JPA與Hibernate

我們知道JPA只是一個規範。為了正常工作,我們還需要指定一個持久性提供程序。默認情況下,Hibernate Framework是Spring交付的JPA的實現。有關它的更多信息,您可以在這裡閱讀。

我們應該記住,索引支持已經很晚才添加到JPA中。在此之前,許多ORM框架通過引入自己的自定義實現來支持索引,而自定義實現的工作方式可能有所不同。 Hibernate Framework也做到了這一點,並引入了org.hibernate.annotations.Index註釋。在使用該框架時,我們必須注意自JPA 2.1規範支持以來已棄用該框架,我們應該使用JPA的框架。

現在,當我們具有一定的技術背景時,我們可以看一下示例並在JPA中定義我們的第一個索引。

3.定義@Index

在本節中,我們將實現索引。稍後,我們將嘗試對其進行修改,以提供不同的自定義可能性。

在開始之前,我們需要正確地初始化我們的項目並定義一個模型。

讓我們實現一個Student實體:

@Entity

 @Table

 public class Student implements Serializable {

 @Id

 @GeneratedValue

 private Long id;

 private String firstName;

 private String lastName;



 // getters, setters

 }

建立模型後,讓我們實現第一個索引。我們要做的就是添加一個@Index註釋。我們做的是,在@Table下註釋indexes屬性。讓我們記住指定列的名稱:

@Table(indexes = @Index(columnList = "firstName"))

firstName列聲明了第一個索引。當我們執行模式創建過程時,我們可以對其進行驗證:

[main] DEBUG org.hibernate.SQL -

 create index IDX2gdkcjo83j0c2svhvceabnnoh on Student (firstName)

現在,該修改我們的聲明以顯示其他功能了。

3.1。 @Index名稱

如我們所見,索引必須有一個名稱。默認情況下,如果未指定,則為提供程序生成的值。當我們想要一個自定義標籤時,我們只需添加name屬性:

@Index(name = "fn_index", columnList = "firstName")

此變體使用用戶定義的名稱創建索引:

[main] DEBUG org.hibernate.SQL -

 create index fn_index on Student (firstName)

此外,我們可以通過在指定模式的名字創建了我們在不同的架構指數name

@Index(name = "schema2.fn_index", columnList = "firstName")

3.2。多@Index

現在,讓我們仔細看看columnList語法:

column ::= index_column [,index_column]*

 index_column ::= column_name [ASC | DESC]

眾所周知,我們可以指定要包含在索引中的列名稱。當然,我們可以為單個索引指定多個列。我們通過用逗號分隔名稱來做到這一點:

@Index(name = "mulitIndex1", columnList = "firstName, lastName")



 @Index(name = "mulitIndex2", columnList = "lastName, firstName")
[main] DEBUG org.hibernate.SQL -

 create index mulitIndex1 on Student (firstName, lastName)



 [main] DEBUG org.hibernate.SQL -

 create index mulitIndex2 on Student (lastName, firstName)

請注意,持久性提供程序必須遵守列的指定順序。在我們的示例中,即使索引指定了相同的列集,索引也略有不同。

3.3。 @Index順序

當我們回顧了上一節中的語法時,我們還可以column_name ASC (升序)和DESC (降序)值。我們使用它來設置索引列中值的排序順序:

@Index(name = "mulitSortIndex", columnList = "firstName, lastName DESC")
[main] DEBUG org.hibernate.SQL -

 create index mulitSortIndex on Student (firstName, lastName desc)

我們可以指定每列的順序。如果我們不這樣做,則假定升序。

3.4。 @Index唯一性

最後一個可選參數是unique屬性,該屬性定義索引是否唯一。唯一索引可確保索引字段不會存儲重複值。默認情況下,它為false 。如果要更改它,可以聲明:

@Index(name = "uniqueIndex", columnList = "firstName", unique = true)
[main] DEBUG org.hibernate.SQL -

 alter table Student add constraint uniqueIndex unique (firstName)

當我們以這種方式創建索引時,我們在列上添加了唯一性約束,類似地,作為@Column批註上unique屬性也是如此。 @Index @Column具有優勢,因為它可以聲明多列唯一約束:

@Index(name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)

3.5。單個實體上有多個@Index

到目前為止,我們已經實現了索引的不同變體。當然,我們不僅限於在實體上聲明單個索引。讓我們收集聲明並一次指定每個索引。 @Index註釋並用逗號分隔來做到這一點:

@Entity

 @Table(indexes = {

 @Index(columnList = "firstName"),

 @Index(name = "fn_index", columnList = "firstName"),

 @Index(name = "mulitIndex1", columnList = "firstName, lastName"),

 @Index(name = "mulitIndex2", columnList = "lastName, firstName"),

 @Index(name = "mulitSortIndex", columnList = "firstName, lastName DESC"),

 @Index(name = "uniqueIndex", columnList = "firstName", unique = true),

 @Index(name = "uniqueMulitIndex", columnList = "firstName, lastName", unique = true)

 })

 public class Student implements Serializable

而且,我們還可以為同一組列創建多個索引。

3.6。首要的關鍵

當我們談論索引時,我們必須在主鍵上停一會兒。 EntityManager管理的每個實體都必須指定一個映射到主鍵的標識符。

通常,主鍵是特定類型的唯一索引。值得補充的是,我們不必以前面介紹的方式聲明此鍵的定義。一切由@Id註釋自動完成。

3.7。非實體@Index

在學習了不同的實現索引的方法之後,我們應該提到@Table不是唯一指定索引的地方。以同樣的方式,我們可以在申報指標@SecondaryTable ,@CollectionTable, @JoinTable@TableGenerator註解。這些示例不在本文討論之列。有關更多詳細信息,請檢查javax.persistence JavaDoc

4。結論

在本文中,我們討論了使用JPA聲明索引。我們首先回顧了有關它們的常識。後來,我們實現了第一個索引,並通過示例學習瞭如何通過更改名稱,包括的列,順序和唯一性來對其進行自定義。最後,我們討論了主鍵以及可以聲明它們的其他方式和位置。