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

时间:2013-03-12 21:36:50

标签: java hibernate hibernate-annotations

@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 个答案:

答案 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

感谢。