2009-06-03 120 views
20

我有一個實體類的兩個領域,我不想是唯一的,而是作爲一個鍵本身必須是唯一的複合領域。例如,我有兩個字段(名稱和版本),對於其他記錄可以是相同的,但它們必須是唯一的。使用Hibernate(帶註釋)的最佳方式是什麼?我在其他領域使用Hibernate Validator,但我不確定如何使用它來驗證這兩個字段組成一個唯一的密鑰。我正在使用一個通用的實體類,它具有一個id泛型類型,可以將其替換爲組合鍵類,但我尚未得到很好的工作。如何使用Hibernate獲得兩個字段的唯一鍵?

+0

您是否希望對兩列或包含兩列的表上的「主鍵」設置「唯一約束」? – 2009-06-03 19:54:54

+0

我想在兩列上有一個唯一的約束。例如,名稱和版本的組合必須是唯一的。所以我可以在表中記錄#1(name = abc/version = 1)和記錄#2(name = abc/version = 2)中的兩條記錄,但是表中沒有兩條記錄,記錄#1 = abc/version = 1)和記錄#2(name = abc/version = 1)。 – 2009-06-08 23:22:03

回答

37

這將創建數據庫的唯一關鍵:

@Table(name = "MYTABLE", 
     uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME", "VERSION" }) }) 

這將通過數據庫的更新被執行或者堅持。

如果您想使用Hibernate Validator強制執行此操作,您需要編寫自己的自定義驗證器。

4

我們通常會將這兩個字段封裝在標記爲@Embeddable的內部鍵類中。例如:

@Entity 
public class Foo { 

    @EmbeddedId() 
    private Key key; 
    ... 

    @Embeddable 
    public static class Key { 
    @Column(nullable=false) 
    private String name; 
    @Column(nullable=false) 
    private int version; 

    protected Key() { 
     // for hibernate 
    } 
    public Key (String name, int version) { 
     this.name = name; 
     this.version = version; 
    } 
    ... 
    // You probably want .equals and .hashcode methods 
    } 
} 
相關問題