web-dev-qa-db-fra.com

Comment introduire une contrainte multi-colonnes avec des annotations JPA?

J'essaie d'introduire une contrainte multi-clés sur une entité mappée JPA:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

    @ManyToOne
    @JoinColumn("productId")
    private Product product;

    @Column(nullable=false);
    private long serial;
}

Fondamentalement, la paire (produit, série) doit être unique, mais je n'ai trouvé qu'un moyen de dire que la série doit être unique. Ce n'est évidemment pas une bonne idée car différents produits peuvent avoir les mêmes numéros de série.

Existe-t-il un moyen de générer cette contrainte via JPA ou suis-je obligé de la créer manuellement dans DB?

76
plouh

Vous pouvez déclarer des contraintes uniques à l'aide de l'annotation @Table(uniqueConstraints = ...) dans votre classe d'entité, c'est-à-dire.

@Entity
@Table(uniqueConstraints={
    @UniqueConstraint(columnNames = {"productId", "serial"})
}) 
public class InventoryItem {
    ...
}

Notez que cela ne crée pas comme par magie la contrainte unique dans la base de données, vous avez toujours besoin d'un DDL pour qu'elle soit créée. Mais il semble que vous utilisiez une sorte d'outil automatisé pour créer la base de données basée sur les définitions d'entités JPA.

150
psp

Comme déjà répondu, l'index multi-colonnes peut être ajouté en utilisant @Table annotation. Cependant, columnNames doit être le nom des colonnes de base de données réelles, pas l'attribut de classe. Donc, si la colonne est comme suit:

@Column(name="product_id")
Long productId;

Puis le @Table l'annotation doit ressembler à ce qui suit

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"}) 
58
SJha