Javaの@UniqueConstraintアノテーション


168

Java Beanを持っています。ここで、フィールドが一意であることを確認したいと思います。

次のコードを使用しています。

@UniqueConstraint(columnNames={"username"})
public String username;

しかし、私はいくつかのエラーを得ています:

@UniqueConstraint is dissallowed for this location

一意の制約を使用する適切な方法は何ですか?

注:私はplayフレームワークを使用しています。


15
「しかし、エラーが発生しています。」質問で受け取るエラーを常に指定してください。あなたは私たちがあなたの問題を解決するのに非常に役立つかもしれない関連情報を持っています-それをあなた自身に保管しないでください。
Jon Skeet

@idアノテーションを使用できますか?
Albinoswordfish

回答:


414

フィールド値が一意であることを確認するには、次のように書くことができます

@Column(unique=true)
String username;

@UniqueConstraintアノテーションは、テーブルレベルで複数の一意のキーにアノテーションを付けるためのものです。そのため、フィールドに適用するとエラーが発生します。

参照(JPA TopLink):


17
そのあなたがJPAを許可すればそれだけで仕事にテーブル作成することに注意することが重要
naoruを

118

次の構文でクラスレベルで使用できます

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"username"})})
public class SomeEntity {
    @Column(name = "username")
    public String username;
}

41

私は現在、HibernateとJPA 2.0アノテーションでPlayフレームワークも使用しており、このモデルは問題なく動作します

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames = {"id_1" , "id_2"})})
public class class_name {

@Id
@GeneratedValue
public Long id;

@NotNull
public Long id_1;

@NotNull
public Long id_2;

}

お役に立てば幸いです。


20

注: Kotlinでは、アノテーションで配列を宣言するための構文ではarrayOf(...)なく、{...}

@Entity
@Table(uniqueConstraints=arrayOf(UniqueConstraint(columnNames=arrayOf("book", "chapter_number"))))
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)

注: Kotlin 1.2以降では、[...]構文を使用できるため、コードがはるかにシンプルになります

@Entity
@Table(uniqueConstraints=[UniqueConstraint(columnNames=["book", "chapter_number"])])
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)

13

ウェイ1:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames = "column1"),@UniqueConstraint(columnNames = "column2")})

-ここでは、Column1とColumn2の両方が個別に一意の制約として機能します。例:column1またはcolumn2のいずれかの値が一致した場合、UNIQUE_CONSTRAINTエラーが発生します。

ウェイ2:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames ={"column1","column2"})})

-ここでは、column1とcolumn2の両方の値が一意の制約として機能します


4
   @Entity @Table(name = "stock", catalog = "mkyongdb",
   uniqueConstraints = @UniqueConstraint(columnNames =
   "STOCK_NAME"),@UniqueConstraint(columnNames = "STOCK_CODE") }) public
   class Stock implements java.io.Serializable {

   }

一意になる複合キーの作成にのみ使用される一意の制約。一意として結合された主キーとしてテーブルを表します。


3

テーブルの結合された主キーに対して、クラスレベルで@UniqueConstraintを使用できます。例えば:

 @Entity
 @Table(name = "PRODUCT_ATTRIBUTE", uniqueConstraints = {
       @UniqueConstraint(columnNames = {"PRODUCT_ID"}) })

パブリッククラスProductAttribute {}


1

一意の注釈は、属性宣言の真上に配置する必要があります。UniqueContraintsは、データクラス宣言の上の@Tableアノテーションに入ります。下記参照:

@Entity
@Table(uniqueConstraints= arrayOf(UniqueConstraint(columnNames = arrayOf("col_1", "col_2"))))
data class Action(
        @Id @GeneratedValue @Column(unique = true)
        val id: Long?,
        val col_1: Long?,
        val col_2: Long?,
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.