73 votes

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

C'est mon modèle :

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

Chaque numéro de livre commence à 1 par auteur et s'incrémente vers le haut. 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 portant le même numéro et écrits par le même auteur ? Similaire à @Column(unique = true) mais la contrainte ne s'applique que sur le composite de Author X number ?

0 votes

155voto

axtavt Points 126632

Utilisez @UniqueConstraint :

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

0 votes

Pourquoi ne pas faire de l'auteur et du numéro @id comme FK ?

1 votes

Et pour plusieurs uniqueConstraints composites, la syntaxe est @Table(uniqueConstraints = {@UniqueConstraint(columnNames = { "field1", "field2", "field3" }), @UniqueConstraint(columnNames = {"field4", "field5"})}) )

0 votes

En ajoutant cette contrainte unique, hibernate n'est plus capable de créer ma table lorsque je déploie l'application. Pouvez-vous m'aider ?

3voto

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

1voto

Arman Points 395

Comme l'a répondu @axtavt, vous pouvez utiliser la fonction @UniqueConstraint approche. Mais dans le cas d'une table existante, il existe de multiples possibilités. Pas tout le temps, mais en général, vous pouvez obtenir une réponse de type 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. Tout ce que vous pouvez faire pour éviter cela est de vérifier manuellement (en utilisant une simple requête SQL) si toutes vos données existantes sont compatibles avec la Composite Unique Key. Si ce n'est pas le cas, supprimez bien sûr les données à l'origine de la violation. (Une autre façon est de supprimer toute la table existante, mais elle ne peut être utilisée que si elle ne contient pas de données importantes).

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