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