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

J’essaie d’introduire une contrainte multi-clé 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 devrait être unique. Ce n’est évidemment pas une bonne idée puisque 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 le créer manuellement dans DB?

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

 @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 firebase database, vous avez toujours besoin d’un DDL pour la créer. Mais il semble que vous utilisiez un outil automatisé pour créer la firebase database en fonction des définitions d’entités JPA.

Comme il a déjà été répondu, l’index multi-colonnes peut être ajouté à l’aide de l’annotation @Table . Cependant, columnNames doit être le nom des colonnes de firebase database réelles, pas l’atsortingbut de classe. Donc, si la colonne est comme suit:

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

@Table annotation @Table devrait alors être la suivante

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