web-dev-qa-db-fra.com

Comment créer un index avec JPA / hibernate et utiliser des champs de MappedSuperClass avec des champs d'entité concrète

J'ai le @MappedSuperClass (Exemple simplifié):

@MappedSuperclass
public abstract class MySuperClass {

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false)
    private Date creationDate;

    // ...
}

et un concret Entity (exemple simplifié):

@Entity
public class MyEntity extends MySuperClass {
    @Index(name = "IDX_MYINDEX")
    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private MyType type;

    @Index(name = "IDX_MYINDEX")
    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private MyResult status;

    // ...
}

Maintenant, j'ai besoin d'un index comprenant les colonnes MySuperClass.creationDate, MyEntity.status Et MyEntity.type.

Si j'ajoute @Index(name = "IDX_MYINDEX") à MySuperClass.creationDate Hibernate ajoute un index de creationDate à chaque entité héritée de MySuperClass.

J'ai essayé @AttributeOverride Mais il n'est pas compatible avec les index.

Des idées? TIA!

17
t777

Si vous utilisez JPA 2.1 alors vous pouvez utiliser l'annotation de classe @Table avec ses index d'attributs

@Table(indexes = { @Index(name = "IDX_MYIDX1", columnList = "id,name,surname") })

Veuillez noter que, comme le dit la documentation

Ils ne sont utilisés que si la génération de table est en vigueur. Par défaut, aucun index supplémentaire.

columnlist, comme indiqué ci-dessus, accepte la liste des noms de colonne comme une liste séparée par des virgules.

Si vous n'utilisez pas JPA 2.1, vous pouvez simplement utiliser l'ancien Hibernates @Index annotation (notez que cela est déjà obsolète). Il y a l'attribut columnNames où vous pouvez passer un tableau de noms de colonnes quel que soit le champ au-dessus duquel il est déclaré.

@Index(name = "IDX_MYIDX1", columnNames = { "id", "name", "surname"})
51
Maciej Dobrowolski

Utilisez l'annotation @Index et utilisez le paramètre "columnList" pour définir les colonnes à utiliser pour créer votre index. Cette liste doit être constituée d'une liste de valeurs séparées par des virgules des noms de colonne.

Important: N'oubliez pas d'ajouter la propriété de nom de colonne (via l'annotation de colonne) à toutes les propriétés qui composent cet index, sinon vous obtiendrez une erreur lors du démarrage de votre conteneur.

3
dontForgetTheJoker
@Table(name = "table_name",indexes = [Index(name = "name_of_index", columnList = "liste of fields separated by ',' ")])
0
babin souare