2009-06-03 5 views
20

私は一意ではなく、それ自身がユニークでなければならないキーの複合フィールドとして使用されることになるエンティティクラスの2つのフィールドを持っています。たとえば、2つのフィールド(名前とバージョン)があり、他のレコードと同じにすることができますが、一緒に一意にする必要があります。 Hibernate(注釈付き)を使用してそれを行う最善の方法は何ですか?私は他のフィールドでHibernate Validatorを使用していますが、2つのフィールドが一緒になって一意のキーを構成することを検証する方法はありません。私は複合キークラスのためにスワップアウトすることができるidジェネリックタイプを持っているジェネリックエンティティクラスを使用していますが、まだうまく動作するようにしています。これは、更新時にデータベースによって強制または持続されますHibernateで2つのフィールドの一意のキーを取得する方法は?

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

+0

2つの列に「一意制約」を指定するか、2つの列で構成される表に「主キー」を設定しますか? –

+0

2つの列に一意の制約が必要です。たとえば、名前とバージョンの組み合わせは一意でなければなりません。レコード#1(name = abc/version = 1)とレコード#2(name = abc/version = 2)の2つのレコードをレコード#1(name = abc/version = 1)とレコード#2(name = abc/version = 1)を使用しています。 –

答えて

37

これは、データベース上で一意のキーを作成します。

Hibernate Validatorを使用してこれを強制したい場合は、独自のカスタムバリデータを記述する必要があります。

+0

とpkとしてエンティティに書かれているもの... ... pkが名前とバージョンの場合 –

+1

@ yoav.str - PKが名前とバージョンの場合、代わりに@ Id/@でコンポジット主キーを使用する必要がありますIdClassまたは@ EmbeddedId/@ Embeddable – mtpettyp

+0

これは、Hibernate 3.6.3.Finalを使用して私のために働いていました。ありがとう! – Jorge

4

通常、@Embeddableとマークされた内部キークラスに2つのフィールドをラップします。たとえば、次のようになります。

@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 
    } 
} 
関連する問題