如前所述,当它只有一个字段时,它是@Column(unique = true)
一种快捷方式。UniqueConstraint
从您给出的示例中,两者之间存在巨大差异。
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
此代码意味着两者mask
和group
都必须是唯一的,但要分开。这意味着,例如,如果您有一条带有mask.id = 1的记录并尝试插入另一条带有mask.id = 1的记录,您将收到错误,因为该列应该具有唯一值。这同样适用于团体。
另一方面,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
意味着 mask + group 组合的值应该是唯一的。这意味着您可以拥有例如具有mask.id = 1和group.id = 1的记录,如果您尝试插入另一个具有mask.id = 1和group.id = 2的记录,它将被插入成功,而在第一种情况下它不会。
如果您希望掩码和组分别是唯一的并且在类级别是唯一的,则必须编写如下代码:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
这与第一个代码块具有相同的效果。