Como disse antes, @Column(unique = true)
é um atalho paraUniqueConstraint
quando é apenas um campo.
Pelo exemplo que você deu, há uma grande diferença entre os dois.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Este código implica que ambos mask
e group
devem ser únicos, mas separadamente. Isso significa que se, por exemplo, você tiver um registro com mask.id = 1 e tentar inserir outro registro com mask.id = 1 , receberá um erro, porque essa coluna deve ter valores únicos. O mesmo se aplica ao grupo.
Por outro lado,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Implica que os valores de máscara + grupo combinados devem ser únicos. Isso significa que você pode ter, por exemplo, um registro com mask.id = 1 e group.id = 1 , e se você tentar inserir outro registro com mask.id = 1 e group.id = 2 , ele será inserido com sucesso, enquanto no primeiro caso não o faria.
Se você quiser que a máscara e o grupo sejam únicos separadamente e no nível da classe, você terá que escrever o código da seguinte forma:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Isso tem o mesmo efeito que o primeiro bloco de código.
unique=true
, o índice não foi adicionado pelo atualizador automático do esquema.@UniqueConstraint
fez parecer. Pode ser um bug.