118

@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;
4

4 回答 4

177

如前所述,当它只有一个字段时,它是@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;

此代码意味着两者maskgroup都必须是唯一的,但要分开。这意味着,例如,如果您有一条带有mask.id = 1的记录并尝试插入另一条带有mask.id = 1的记录,您将收到错误,因为该列应该具有唯一值。这同样适用于团体。

另一方面,

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

意味着 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")
        }
)

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

于 2016-04-29T18:23:59.593 回答
27

来自 Java EE 文档:

public abstract boolean unique

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

文档

于 2013-03-12T21:39:19.120 回答
25

除了波阿斯的回答....

@UniqueConstraint允许您命名约束,同时@Column(unique = true)生成一个随机名称(例如UK_3u5h7y36qqa13y3mauc5xxayq)。

有时,了解约束与哪个表相关联会很有帮助。例如:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {
      @UniqueConstraint(
          columnNames = {"mask", "group"},
          name="uk_product_serial_group_mask"
      )
   }
)
于 2015-12-03T17:46:28.820 回答
6

除了@Boaz 和@vegemite4me 的答案......

通过实现ImplicitNamingStrategy,您可以创建自动命名约束的规则。请注意,您metadataBuilder在 Hibernate 初始化期间将命名策略添加到:

metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());

它适用于@UniqueConstraint,但不适用于@Column(unique = true),它总是生成一个随机名称(例如 UK_3u5h7y36qqa13y3mauc5xxayq)。

有一个错误报告来解决这个问题,所以如果可以的话,请在那里投票以实现这个。这里: https ://hibernate.atlassian.net/browse/HHH-11586

谢谢。

于 2017-06-27T20:05:37.567 回答