Tutorial :@UniqueConstraint annotation in Java


I have a Java bean. Now, I want to be sure that the field should be unique. I am using following code:

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

But am getting some error:

@UniqueConstraint is dissallowed for this location  

Whats the proper way to use unique constraints?

Note: I am using play framework.


To ensure a field value is unique you can write

@Column(unique=true)  String username;  

The @UniqueConstraint annotation is for annotating multiple unique keys at the table level, which is why you get an error when applying it to a field.

References (JPA TopLink):


You can use at class level with following syntax

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


I'm currently using play framework too with hibernate and JPA 2.0 annotation and this model works without problems

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

Hope it helped.


Note: In Kotlin the syntax for declaring the arrays in annotations uses arrayOf(...) instead of {...}

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

Note: As of Kotlin 1.2 its is possible to use the [...] syntax so the code become much simpler

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


Way1 :

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

-- Here both Column1 and Column2 acts as unique constraints separately. Ex : if any time either the value of column1 or column2 value matches then you will get UNIQUE_CONSTRAINT Error.

Way2 :

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

-- Here both column1 and column2 combined values acts as unique constraints


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

Unique constraints used only for creating composite key ,which will be unique.It will represent the table as primary key combined as unique.


you can use @UniqueConstraint on class level, for combined primary key in a table. for example:

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

public class ProductAttribute{}


Unique annotation should be placed right above the attribute declaration. UniqueContraints go into the @Table annotation above the data class declaration. See below:

@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?,  )  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »