Como se dijo antes, @Column(unique = true)
es un atajo para UniqueConstraint
cuando es un solo campo.
Por el ejemplo que dio, hay una gran diferencia entre ambos.
@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
y group
tienen que ser únicos, pero por separado. Eso significa que si, por ejemplo, tiene un registro con mask.id = 1 e intenta insertar otro registro con mask.id = 1 , obtendrá un error, porque esa columna debe tener valores únicos. Lo mismo se aplica al grupo.
Por otra parte,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Implica que los valores de máscara + grupo combinados deben ser únicos. Eso significa que puede tener, por ejemplo, un registro con mask.id = 1 y group.id = 1 , y si intenta insertar otro registro con mask.id = 1 y group.id = 2 , se insertará con éxito, mientras que en el primer caso no lo haría.
Si desea que tanto la máscara como el grupo sean únicos por separado y para eso a nivel de clase, tendrá que escribir el código de la siguiente manera:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Esto tiene el mismo efecto que el primer bloque de código.
unique=true
, el actualizador automático de esquemas no agregó el índice.@UniqueConstraint
lo hizo aparecer. Podría ser un error.