2010-12-28 10 views
23

ハイバネートPOJOに独自の制約を実装するにはどうすればよいですか?データベースには何も含まれていないと仮定します。Hibernate JPA2でユニーク制約を使用する

私は@Column()注釈で一意の属性を見ましたが、動作させることができませんでしたか?
この制約を複数の列に適用するとどうなりますか?

+0

'@ Column'の' C'では 'c'ではありません!!! – KNU

答えて

32

Basciallyで@Table(uniqueConstraints = ...)アノテーションを使ってユニーク制約を宣言することができます。

@UniqueConstraintおよびunique属性@Columnは、対応する制約を生成するためのスキーマ生成ツールのための命令であり、制約自体を実装しません。

新しいエンティティを挿入する前に何らかの手動によるチェックを行うことができますが、この場合、同時トランザクションで発生する可能性のある問題を認識する必要があります。

したがって、データベースに制約を適用することが推奨されます。

+1

したがって、dbが明示的に追加しない限り、アプリケーションは一意の制約を強制しません。私はddlがオフであると仮定しています –

43

は、あなたは、データベースのサポートなしでユニーク制約を実装することはできません、あなたのクラス

@Entity 
@Table(uniqueConstraints= 
      @UniqueConstraint(columnNames = {"surname", "name"})) 
public class SomeEntity { 
    ... 
} 
+0

私はそれを使用しようとしましたが、このアノテーションを識別できませんでした –

+0

どちらか? @UniqueConstraint?それはjavax.persistence.UniqueConstraintから来ています – Hons

+1

私はテーブルに制約を追加しましたが動作しません –

19

JPA2では、あなたはフィールドに直接ユニーク制約を追加することができます

@Entity 
@Table(name="PERSON_TABLE") 
public class Person{ 
    @Id 
    @Column(name = "UUID") 
    private String id; 

    @Column(name = "SOCIALSECURITY", unique=true) 
    private String socialSecurityNumber; 

    @Column(name = "LOGINID", unique=true) 
    private String loginId; 
} 

私見そのはるかに良いテーブルのbegginingよりも属性に直接ユニーク制約を割り当てます。

ただし、複合ユニークキーを宣言する必要がある場合は、@tableアノテーションで宣言することが唯一の選択肢です。

+0

これは単一列に対するユニークな制約ですか、これはsocialSecurityNumberとloginIdの組み合わせに対するユニークな制約ですか? –

+13

@StephanSchielkeこれは、各列に対して個別の一意制約を作成します。複数のフィールドに一意の制約を作成するには、Honsのアプローチを使用する必要があります。 – Naliba

関連する問題