2010-05-05 3 views
51

Je suis en train d'introduire une contrainte multitouche sur une entité mappée JPA:Comment introduire une contrainte multi-colonnes avec des annotations JPA?

public class InventoryItem { 
    @Id 
    private Long id; 

    @Version 
    private Long version; 

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

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

En gros (produit, série) paire doit être unique, mais je ne trouve un moyen de dire que série doit ê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 la créer manuellement dans DB?

Répondre

110

Vous pouvez déclarer des contraintes uniques en utilisant l'annotation @Table(uniqueConstraints = ...) dans votre classe d'entité, à savoir

@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 encore besoin d'un DDL pour qu'il soit créé . Mais il semble que vous utilisiez une sorte d'outil automatisé pour créer la base de données en fonction des définitions d'entité JPA.

+0

Est-ce genre de chose nécessaire pour une base de données existante avec les contraintes déjà en place? – Rob

33

Comme déjà répondu, l'index multi-colonne peut être ajouté en utilisant l'annotation @Table. Toutefois, 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 ce qui suit:

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

Ensuite, l'annotation @Table devrait être comme les suivantes

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

Ceci est une clarification très importante: les noms de tables et non les noms d'objets. – Calabacin

Questions connexes