web-dev-qa-db-fra.com

Hibernation: créer un index

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.

17
Rooky

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.

30
danbst

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.

4

Pour résumer:

2
naXa
  • JAVAX

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 :

  • Nous n'avons pas besoin d'ajouter de dépendance supplémentaire
  • Nous pouvons également définir une clé unique dans @Table
  • Hibernate Même chose que nous pouvons faire avec @Index, mais pour cela, nous devons ajouter la dépendance Hibernate.
0
Tapan