休眠注释中的@UniqueConstraint和@Column(unique = true)

2022-08-31 08:50:46

@UniqueConstraint@Column(unique = true)有什么区别?

例如:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;

答案 1

如前所述,当它只是一个字段时,它是一个捷径。@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.id = 1 的记录,并尝试插入另一条 mask.id = 1 的记录,您将收到错误,因为该列应具有唯一值。对于组,使用相同的 aplies。maskgroup

另一方面

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)

这意味着掩码 + 组组合的值应该是唯一的。这意味着,例如,您可以拥有一条 mask.id = 1group.id = 1 的记录,如果您尝试插入另一条 mask.id = 1group.id = 2 的记录,它将成功插入,而在第一种情况下则不会。

如果您希望掩码和组在类级别单独唯一,则必须按如下方式编写代码:

@Table(
        name = "product_serial_group_mask",
        uniqueConstraints = {
                @UniqueConstraint(columnNames = "mask"),
                @UniqueConstraint(columnNames = "group")
        }
)

这与第一个代码块具有相同的效果。


答案 2

来自 Java EE 文档:

public abstract boolean unique

(可选)该属性是否为唯一键。这是表级别 UniqueConstraint 批注的快捷方式,当唯一键约束仅为单个字段时很有用。除了主键映射所带来的任何约束以及在表级别指定的约束之外,此约束还适用。

查看文档


推荐