Comme dit précédemment, @Column(unique = true)
est un raccourci vers UniqueConstraint
quand il ne s'agit que d'un seul champ.
D'après l'exemple que vous avez donné, il y a une énorme différence entre les deux.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Ce code implique que les deux mask
et group
doivent être uniques, mais séparément. Cela signifie que si, par exemple, vous avez un enregistrement avec un mask.id = 1 et essayez d'insérer un autre enregistrement avec mask.id = 1 , vous obtiendrez une erreur, car cette colonne doit avoir des valeurs uniques. La même chose vaut pour le groupe.
D'autre part,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Implique que les valeurs de masque + groupe combinées doivent être uniques. Cela signifie que vous pouvez avoir, par exemple, un enregistrement avec mask.id = 1 et group.id = 1 , et si vous essayez d'insérer un autre enregistrement avec mask.id = 1 et group.id = 2 , il sera inséré avec succès, alors que dans le premier cas non.
Si vous souhaitez que le masque et le groupe soient uniques séparément et au niveau de la classe, vous devez écrire le code comme suit:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Cela a le même effet que le premier bloc de code.
unique=true
, l'index n'a pas été ajouté par le programme de mise à jour automatique du schéma.@UniqueConstraint
l'a fait apparaître. Cela pourrait être un bug.