Рубрики
Без рубрики

Определение индексов в JPA

Узнайте, как внедрять и использовать индексы с помощью JPA.

Автор оригинала: baeldung.

Определение индексов в JPA

1. Введение

В этом учебнике мы обсудим определение индексов с использованием @Index аннотация . На примерах мы узнаем, как определить наш первый индекс с помощью JPA и Hibernate. После этого мы изменим определение, показывающее дополнительные способы настройки индекса.

2. @Index Аннотация

Давайте начнем с быстрого резюме. Индекс базы данных является структура данных, которая повышает скорость операций по извлечению данных на столе за счет дополнительных пишет и складских помещений. В основном, это копия выбранных столбцов данных из одной таблицы. Мы должны создавать индексы для повышения производительности на нашем уровне настойчивости.

JPA позволяет нам достичь этого, определяя индексы из нашего кода с помощью @Index . Эта аннотация интерпретируется процессом генерации схемы, создавая артефакты автоматически. Обратите внимание, что нет необходимости указывать какой-либо индекс для наших сущностей.

Теперь давайте посмотрим на определение.

2.1. javax.persistence.Index

Поддержка индекса была, наконец, добавлена в спецификации JPA 2.1 к javax.persistence.Index . Эта аннотация позволит нам определить индекс для нашей таблицы и настроить его соответствующим образом:

@Target({})
@Retention(RUNTIME)
public @interface Index {
    String name() default "";
    String columnList();
    boolean unique() default false;
}

Как видим, только колонкаList атрибут является обязательным, который мы должны определить. Мы лучше посмотрим на каждый из параметров позже, изутовив примеры.

2.2. JPA vs. Спящий

Мы знаем, что JPA является лишь спецификацией. Чтобы работать правильно, нам также необходимо указать поставщика настойчивости. По умолчанию Hibernate Framework является реализацией JPA, поставляемой к весне. Подробнее об этом, вы можете прочитать здесь .

Следует помнить, что поддержка индекса была добавлена в JPA очень поздно. До этого многие ORM Frameworks поддерживают индексы, внедряя свои собственные пользовательские реализации, которые могут работать по-разному. В Hibernate Framework также сделали это и представили org.hibernate.annotations.Index аннотация. Работая с этой структурой, мы должны быть осторожны, чтобы она была увясжена после поддержки спецификации JPA 2.1, и мы должны использовать поддержку JPA.

Теперь, когда у нас есть некоторые технические предпосылки, мы можем пройти через примеры и определить наш первый индекс в JPA.

3. Определение @Index

В этом разделе мы реализуем наш индекс. Позже мы попытаемся изменить его, представляя различные возможности настройки.

Прежде чем мы начнем, мы должны инициализировать наш проект должным образом и определить модель .

Давайте реализуем Студенческие сущность:

@Entity
@Table
public class Student implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    // getters, setters
}

Когда у нас будет модель, давайте реализуем первый индекс. Все, что нам нужно сделать, это добавить @Index аннотация. Мы делаем это в @Table аннотация под индексы атрибут. Не забудьте указать название столбца:

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

Мы объявили самый первый индекс с использованием первоеимя столбец. Когда мы выполняем процесс создания схемы, мы можем проверить его:

[main] DEBUG org.hibernate.SQL -
  create index IDX2gdkcjo83j0c2svhvceabnnoh on Student (firstName)

Теперь пришло время изменить нашу декларацию, показывающую дополнительные функции.

3.1. @Index Имя

Как мы видим, наш индекс должен иметь имя. По умолчанию, если мы не указать так, это поставщик генерируемых значение. Когда мы хотим иметь пользовательский ярлык, мы должны просто добавить имя атрибут:

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

Этот вариант создает индекс с определяемым пользователем именем:

[main] DEBUG org.hibernate.SQL -
  create index fn_index on Student (firstName)

Кроме того, мы можем создать наш индекс в другой схеме, указав имя схемы в имя :

@Index (имя,)

3.2. Многоколумный @Index

Теперь давайте более подробно рассмотрим колонкаList синтаксис:

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 Приказ

Когда мы рассмотрели синтаксис в предыдущем разделе, мы также можем указать АСК (восходящий) и DESC (нисходящие) значения после column_name . Мы используем его для настройки порядка сортировки значений в индексированной колонке:

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

Мы можем указать порядок для каждой колонки. Если мы этого не делаем, предполагается восходящий порядок.

3.4. @Index Уникальность

Последним дополнительным параметром является уникальный атрибут, который определяет, является ли индекс уникальным. Уникальный индекс гарантирует, что индексированные поля не хранят дубликаты значений. По умолчанию, это ложные . Если мы хотим изменить его, мы можем объявить:

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

Создавая таким образом индекс, мы добавляем ограничение уникальности в наши столбцы, подобно тому, как уникальный атрибут на @Column аннотация делать. @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. Мы начали с рассмотрения общих знаний о них. Позже мы внедрили наш первый индекс и, на примерах, научились его настраивать, меняя имя, включая столбцы, порядок и уникальность. В конце концов, мы говорили о первичных ключей и дополнительных способов и мест, где мы можем объявить их.

Как всегда, примеры из статьи доступны более на GitHub .