Java中的@UniqueConstraint批注


168

我有一个Java bean。现在,我想确保该字段应该唯一。

我正在使用以下代码:

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

但是我遇到了一些错误:

@UniqueConstraint is dissallowed for this location

使用唯一约束的正确方法是什么?

注意:我正在使用播放框架。


15
“但是出现了一些错误。” 始终指定您在问题中遇到的错误。您拥有相关信息,这很可能会帮助我们解决您的问题-不要自己解决。
乔恩·斯基特

可以使用@id注释吗?
Albinoswordfish

Answers:


413

为了确保字段值唯一,您可以编写

@Column(unique=true)
String username;

@UniqueConstraint批注用于在表级别批注多个唯一键,这就是为什么将其应用于字段时会出错的原因。

参考(JPA TopLink):


16
重要的是要注意,它只有在让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错误。

方式二:

@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?,
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.