Hibernate: Создать индекс

Я хочу создать несколько индексов в моей БД. К сожалению, нам нужно сменить поставщика постоянства с EclipseLink на Hibernate, но ни решение с javax.persistence.Index, ни решение с Hibernate не работает.

Вот как выглядит класс:

@Entity
@Table(name = "my_shop")
public class Shop extends BaseEntity {

    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = false)
    private Calendar lastUpdate;
}

Это должно быть решение с помощью javax.persistence. *:

import javax.persistence.Index;
import javax.persistence.Table;

@Table(name = "my_shop",
        indexes = @Index(columnList = "lastupdate")
)

Аннотации Hibernate устарели, поэтому должна быть причина не использовать эти аннотации:

import org.hibernate.annotations.Index; // deprecated
import org.hibernate.annotations.Table;

@Table(...,
        indexes = @Index(columnNames = "lastupdate")
)

Я использую Glassfish 3.1.2.2, PostgreSQL 9.1, JPA 2.1 и hibernate-core 4.3.4.Final. Если я загляну в базу данных, там нет индексов, созданных для определенного поля через psql "\ d+".

Вот как выглядит мой файл persistence.xml:

...
    <property name="hibernate.hbm2ddl.auto" value="create"/>
    <property name="dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
...

Только EclipseLink может справиться с этим легко:

import org.eclipse.persistence.annotations.Index;

@Entity
@Table(name = "my_shop")
public class Shop extends BaseEntity {

    @Index
    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = false)
    private Calendar lastUpdate;
}

Я протестировал данные решения со всеми комбинациями "lastupdate", "lastUpdate" и дополнительными атрибутами "name" в @Column и @Index, но, похоже, ничего не работает.

Обновление 1

Действительно, это решение работает:

@javax.persistence.Table(name = "my_shop")
@Table(appliesTo = "my_shop"
        ,indexes = {@Index(columnNames = "name", name = "name"),
                @Index(columnNames = "lastupdate", name = "lastupdate")}
)

Но все же org.hibernate.annotations.Index; помечен как устаревший. Так это хорошая практика или нет? Если не то, что альтернатива, потому что, по-видимому, javax.persistence.Index не работает.

org.hibernate.annotations.Index; работает с каждым значением: создавать, обновлять,... javax.persistence.Index не имеет значения, какое значение имеет "hibernate.hbm2ddl.auto", не работает.

Ответ 1

Я использую JPA 2.1 с Hibernate 4.3 и PostgreSQL 9.3. У меня нет проблем с индексами

hibernate-commons-annotations-4.0.4.Final.jar
hibernate-core-4.3.1.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar

Хотя моя конфигурация имеет

<property name="hibernate.hbm2ddl.auto" value="update"/>

И что моя сущность, отображающая

import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;

@Entity
@Table(name = "users", indexes = {
        @Index(columnList = "id", name = "user_id_hidx"),
        @Index(columnList = "current_city", name = "cbplayer_current_city_hidx")
})

PS. На самом деле, у меня есть некоторые проблемы с этими аннотациями. Я не могу указать табличное пространство для индекса и должен создавать indecies для подклассов в родительском классе для иерархии SINGLE_TABLE.

Ответ 2

С Hibernate вам нужно ввести атрибут name в аннотации @Index.

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;

@Entity
@Table(
        indexes = {
            @Index(columnList = "description", name = "product_description")
        })
public class Product implements Serializable {
     // ...

     private String description;

     // getters and setters
}

С EclipseLink не требуется, он автоматически создает name.

Ответ 3

Аннотация @Index работает только с hibernate.hbm2ddl.auto=create-drop, см. эту запись на форумах Hibernate.

Одно из предостережений заключается в том, что этот параметр отменяет таблицы, но в целом hibernate.hbm2ddl.auto предназначен только для целей разработки.

Ответ 5

  • JAVAX

Пакет JAVAX уже включен из-за того, что JPA, JERSEY или Spring Boot используют Jersey, поэтому мы должны

 @Table(name = "userDetails",indexes{@Index(columnList="uid,name",name="Index_user")})

Выгоды:

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