2013-03-12 66 views
48

@UniqueConstraint@Column(unique = true)@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; 
+2

注意:在Hibernate 5.4中,当我添加'unique = true'时,索引不会被scheme自动更新器添加。 '@ UniqueConstraint'使它出现。可能是一个错误。 – 2017-02-13 22:10:02

回答

53

正如前面所说,@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.id纪录= 1group.id = 1,如果你尝试插入另一纪录mask.id = 1group.id = 2,它将被成功插入,而在第一种情况下则不会。

如果你想有两个面具组是单独和,在一流水平独特的,你必须编写的代码如下:

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

这有同样的效果第一个代码块。

+0

一旦创建了唯一约束,我可以在我的JPA存储库中通过名称引用约束来查询该问题? – jDub9 2018-01-09 18:48:10

25

从Java EE文档:

public abstract boolean unique 

(可选)属性是否是一个独特的密钥。这是表级别的UniqueConstraint注释的快捷方式,适用于唯一键约束仅为单个字段的情况。除了主键映射和表级指定的约束之外,此约束还适用于任何约束条件 。

doc

+0

所以当我使用这段代码时: @Column(unique = true) @ManyToOne(可选= false,fetch = FetchType.EAGER) private ProductSerialMask mask; @Column(唯一=真) @ManyToOne(可选=假,取= FetchType.EAGER) 私人组基团; 我有两个索引但使用其他方式时我有一个索引它是两列组合吗? – 2013-03-13 10:33:33

12

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

@UniqueConstraint让你名约束,而@Column(unique = true)生成一个随机的名称(例如UK_3u5h7y36qqa13y3mauc5xxayq)。

有时,知道约束与哪个表关联会有所帮助。例如: -

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

除了@波阿斯的和@ vegemite4me的答案....

通过实施ImplicitNamingStrategy你可以自动命名的约束创建规则。注意:您Hibernate的初始化过程中您的命名策略添加到metadataBuilder

metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy()); 

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

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

谢谢。