@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;
答案 0 :(得分:120)
如前所述,当@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
和@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
必须是唯一的,但必须分开。这意味着,例如,如果您有一个 mask.id = 1 的记录,并尝试插入另一条 mask.id = 1 的记录,那么您就是'将收到错误,因为该列应具有唯一值。同组适用于组。
另一方面,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
意味着mask + group组合的值应该是唯一的。这意味着您可以使用 mask.id = 1 和 group.id = 1 的记录,如果您尝试使用插入另一条记录mask.id = 1 和 group.id = 2 ,它会成功插入,而在第一种情况下则不会。
如果您希望将面具和群组分别独立且与班级相同,则您必须按如下方式编写代码:
localString()
这与第一个代码块具有相同的效果。
答案 1 :(得分:27)
来自Java EE文档:
public abstract boolean unique
(可选)属性是否为唯一键。这是一个快捷方式 表级别的UniqueConstraint注释,对于唯一键时非常有用 约束只是一个字段。除了任何约束之外,此约束也适用 主键映射和表级指定的约束。
请参阅doc
答案 2 :(得分:19)
除波阿斯的答案外......
@UniqueConstraint
允许您命名约束,而@Column(unique = true)
生成随机名称(例如UK_3u5h7y36qqa13y3mauc5xxayq
)。
有时知道约束与哪个表相关联会很有帮助。 E.g:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(
columnNames = {"mask", "group"},
name="uk_product_serial_group_mask"
)
}
)
答案 3 :(得分:4)
除了@ Boaz&s和@ vegemite4me的答案之外......
通过实施ImplicitNamingStrategy
,您可以创建自动命名约束的规则。请注意,在Hibernate的初始化过程中,您将命名策略添加到metadataBuilder
:
metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());
适用于@UniqueConstraint
,但不适用于@Column(unique = true)
,它始终生成随机名称(例如UK_3u5h7y36qqa13y3mauc5xxayq)。
有一个错误报告可以解决这个问题,所以如果可以的话,请在那里投票实现这一点。这里: https://hibernate.atlassian.net/browse/HHH-11586
感谢。