115 votes

Comment introduire multi-contrainte de colonne avec des annotations JPA?

Je suis en train d'introduire un multi-contrainte de clé sur une JPA-mappé entité:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

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

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

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

Est-il un moyen pour générer cette contrainte via JPA ou suis-je obligé de créer manuellement de DB?

242voto

psp Points 667

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

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

Notez que ce n'est pas la baguette magique pour créer la contrainte unique dans la base de données, vous avez encore besoin d'un DDL pour qu'il soit créé. Mais il semble que vous soyez à l'aide d'outil automatique pour la création de la base de données fondées sur les définitions d'entités JPA.

88voto

Saket Jha Points 16

columnNames ci-dessus doivent être le nom de réels DB colonnes, l'utilisation de "productId" (et pas product_id) comme un exemple pourrait être trompeuse en raison de camelCase.

@Table(uniqueConstraints= @UniqueConstraint(columnNames = {"product_id", "série"})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X