Comme dit précédemment, @Column(unique = true)
est un raccourci pour UniqueConstraint
lorsqu'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
y group
doivent être uniques, mais distincts. Cela signifie que si, par exemple, vous avez un enregistrement avec un mask.id = 1 et essaie 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 s'applique au groupe.
D'un autre côté,
@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 y groupe.id = 1 et si vous essayez d'insérer un autre enregistrement avec l'option mask.id = 1 y groupe.id = 2 il sera inséré avec succès, alors qu'il ne le sera pas dans le premier cas.
Si vous voulez que le masque et le groupe soient uniques séparément et au niveau de la classe, vous devez écrire le code suivant :
@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.