web-dev-qa-db-fra.com

Création d'un composite Contraintes uniques sur plusieurs colonnes

Voici mon modèle:

class User {...}
class Book {
  User author;
  int number;
}

Chaque numéro de livre commence à 1 par auteur et augmente progressivement. Nous aurons donc les livres 1,2,3 de John Grisham, le livre 1..5 de George Martin, etc ...

Y a-t-il une contrainte unique que je peux placer sur Book, qui garantirait que nous n'avons pas deux livres avec le même numéro du même auteur? Similaire à @Column(unique = true), mais la contrainte ne s'applique que sur le composite de Author X number?

52
ripper234

Utilisation @UniqueConstraint :

@Table(
    uniqueConstraints=
        @UniqueConstraint(columnNames={"author_id", "number"})
)
@Entity
class Book extends Model {
   @ManyToOne
   @JoinColumn(name = "author_id")
   User author;
   int number; 
} 
107
axtavt

Lorsque la table est créée auparavant, il est nécessaire de la supprimer. La clé unique n'est pas ajoutée à la table existante.

4
Tomasz Janisiewicz

Comme @axtavt a répondu, vous pouvez utiliser le @UniqueConstraint approche. Mais dans le cas d'une table existante, il existe plusieurs possibilités. Pas tout le temps, mais en général, vous pouvez obtenir une SQLException. La raison en est que vous pouvez avoir des données existantes dans votre table qui sont en conflit avec la clé unique composite. Donc, tout ce que vous pouvez faire pour éviter cela est de vérifier d'abord manuellement (en utilisant une simple requête SQL) si toutes vos données existantes sont bonnes pour aller avec Composite Unique Key. Sinon, bien sûr, supprimez les données à l'origine de la violation. (Une autre façon consiste à supprimer la table existante mais ne peut être utilisée que si elle ne contient pas de données importantes).

0
Arman