Я хочу создать несколько индексов в моей БД. К сожалению, нам нужно сменить поставщика постоянства с 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", не работает.