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
предназначен только для целей разработки.
Ответ 4
Подводя итог:
Ответ 5
Пакет JAVAX уже включен из-за того, что JPA, JERSEY или Spring Boot используют Jersey, поэтому мы должны
@Table(name = "userDetails",indexes{@Index(columnList="uid,name",name="Index_user")})
Выгоды:
- Нам не нужно добавлять дополнительную зависимость
- Мы также можем определить уникальный ключ внутри @Table
- Hibernate То же самое мы можем сделать с @Index, но для этого нам нужно добавить зависимость Hibernate.