2013-03-12 110 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

謝謝。