Je veux créer plusieurs index dans ma base de données. Malheureusement, nous devons changer le fournisseur de persistance d'EclipseLink en Hibernate, mais ni la solution avec javax.persistence.Index ni la solution avec Hibernate ne fonctionne.
Voici à quoi ressemble la classe:
@Entity
@Table(name = "my_shop")
public class Shop extends BaseEntity {
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = false)
private Calendar lastUpdate;
}
Cela devrait être la solution avec javax.persistence. *:
import javax.persistence.Index;
import javax.persistence.Table;
@Table(name = "my_shop",
indexes = @Index(columnList = "lastupdate")
)
Les annotations Hibernate sont obsolètes, il doit donc y avoir une raison de ne pas utiliser ces annotations:
import org.hibernate.annotations.Index; // deprecated
import org.hibernate.annotations.Table;
@Table(...,
indexes = @Index(columnNames = "lastupdate")
)
J'utilise Glassfish 3.1.2.2, PostgreSQL 9.1, JPA 2.1 et hibernate-core 4.3.4.Final. Si je regarde dans la base de données, il n'y a pas d'index créés sur le champ spécifique via psql "\ d +".
Voici à quoi ressemble mon persistence.xml:
...
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
...
Seul EclipseLink peut gérer cela facilement:
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;
}
J'ai testé les solutions données avec toutes les combinaisons "lastupdate", "lastUpdate" et des attributs supplémentaires "name" dans @Column et @Index, mais rien ne semble fonctionner.
mise à jour 1
En effet cette solution fonctionne:
@javax.persistence.Table(name = "my_shop")
@Table(appliesTo = "my_shop"
,indexes = {@Index(columnNames = "name", name = "name"),
@Index(columnNames = "lastupdate", name = "lastupdate")}
)
Mais reste org.hibernate.annotations.Index;
est marqué comme obsolète. Est-ce donc une bonne pratique de l'utiliser ou non? Sinon, quelle est l'alternative, car apparemment javax.persistence.Index
ne fonctionne pas.
org.hibernate.annotations.Index;
fonctionne avec toutes les valeurs: créer, mettre à jour, ... javax.persistence.Index
n'a pas d'importance quelle valeur "hibernate.hbm2ddl.auto" a, ne fonctionne pas.
J'utilise JPA 2.1 avec Hibernate 4.3 et PostgreSQL 9.3. Je n'ai aucun problème avec les index
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
Bien que ma config ait
<property name="hibernate.hbm2ddl.auto" value="update"/>
Et c'est ma cartographie d'entité
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. En fait, j'ai quelques problèmes avec ces annotations. Je ne peux pas spécifier d'espace disque logique pour l'index et je dois créer des indécies pour les sous-classes de la classe parent pour la hiérarchie SINGLE_TABLE.
Avec Hibernate
, vous devez entrer l'attribut name
dans le @Index
annotation.
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
}
Avec EclipseLink
n'est pas requis, il crée automatiquement le name
.
Le @Index
l'annotation ne fonctionne qu'avec hibernate.hbm2ddl.auto=create-drop
, voir ceci entrée dans les forums Hibernate .
Un seul mot d'avertissement est que cette option supprime les tables, mais en général hibernate.hbm2ddl.auto
est destiné à des fins de développement uniquement.
Pour résumer:
javax.persistence.Index
(voir JSR-000338 , p. 450, point 11.1.23)org.hibernate.annotations.Index
Paquet JAVAX déjà inclus à cause de JPA ou JERSEY ou Spring Boot utilisant Jersey donc nous devrions y aller avec
@Table(name = "userDetails",indexes{@Index(columnList="uid,name",name="Index_user")})
Avantages :