我有一个Java bean。现在,我想确保这个域是唯一的。

我正在使用以下代码:

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

但是我得到了一些错误:

@UniqueConstraint is dissallowed for this location

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

注意:我使用的是play框架。


当前回答

您可以在类级别使用@UniqueConstraint,用于表中的组合主键。例如:

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

其他回答

注意:在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)

定义列约束

当唯一约束仅基于一个字段时,我们可以在该列上使用@Column(unique=true)。

让我们在personNumber字段上定义一个唯一的约束:

@Column(unique=true)
private Long personNumber;

当我们执行模式创建过程时,我们可以从日志中验证它:

[main] DEBUG org.hibernate.SQL -
    alter table Person add constraint UK_d44q5lfa9xx370jv2k7tsgsqt unique (personNumber)

定义唯一约束

JPA通过@UniqueConstraint注释帮助我们实现这一点。我们在uniqueConstraints属性下的@Table注释中这样做。让我们记住指定列的名称:

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "personNumber", "isActive" }) })

我们可以在模式生成后验证它:

[main] DEBUG org.hibernate.SQL -
    alter table Person add constraint UK5e0bv5arhh7jjhsls27bmqp4a unique (personNumber, isActive)

我目前也在使用带有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;

}

希望有帮助。

您可以在类级别使用@UniqueConstraint,用于表中的组合主键。例如:

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

您可以在类级别使用以下语法

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