web-dev-qa-db-ja.com

Hibernate JPA2で一意の制約を使用する

休止状態のPOJOに独自の制約を実装するにはどうすればよいですか?データベースに何も含まれないと仮定します。

@Column()アノテーションで一意の属性を見ましたが、機能させることができませんでしたか?
この制約を複数の列に適用する場合はどうなりますか?

23
Feras Odeh

基本的に、データベースをサポートせずに一意制約を実装することはできません。

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

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

したがって、データベースに制約を適用することをお勧めします。

33
axtavt

クラスで@Table(uniqueConstraints = ...)アノテーションを使用して一意の制約を宣言できます

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

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;
}

私見では、テーブルを開始するよりも、一意の制約を属性に直接割り当てる方がはるかに優れています。

ただし、複合一意キーを宣言する必要がある場合は、@table注釈が唯一のオプションです。

19
will824