Come detto prima, @Column(unique = true)
è una scorciatoia per UniqueConstraint
quando è solo un singolo campo.
Dall'esempio che hai fornito, c'è un'enorme differenza tra i due.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Questo codice implica che entrambi mask
e group
devono essere unici, ma separatamente. Ciò significa che se, ad esempio, hai un record con mask.id = 1 e cerchi di inserire un altro record con mask.id = 1 , otterrai un errore, perché quella colonna dovrebbe avere valori univoci. Lo stesso vale per il gruppo.
D'altro canto,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Implica che i valori di maschera + gruppo combinati dovrebbero essere univoci. Ciò significa che puoi avere, ad esempio, un record con mask.id = 1 e group.id = 1 , e se provi a inserire un altro record con mask.id = 1 e group.id = 2 , verrà inserito con successo, mentre nel primo caso no.
Se desideri che sia la maschera che il gruppo siano unici separatamente ea livello di classe, dovresti scrivere il codice come segue:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Questo ha lo stesso effetto del primo blocco di codice.
unique=true
, l'indice non è stato aggiunto dallo schema di aggiornamento automatico.@UniqueConstraint
l'ha fatto apparire. Potrebbe essere un bug.