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?
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.
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"})