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

我正在使用以下代码:

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

但是我得到了一些错误:

@UniqueConstraint is dissallowed for this location

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

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


当前回答

定义列约束

当唯一约束仅基于一个字段时,我们可以在该列上使用@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)

其他回答

定义列约束

当唯一约束仅基于一个字段时,我们可以在该列上使用@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)

@UniqueConstraint此注释用于注释表级别上由逗号分隔的单个或多个惟一键,这就是为什么您会得到一个错误。 只有让JPA创建您的表,它才会工作

例子

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder(builderClassName = "Builder", toBuilder = true)
@Entity
@Table(name = "users", uniqueConstraints = @UniqueConstraint(columnNames = {"person_id", "company_id"}))
public class AppUser extends BaseEntity {

    @Column(name = "person_id")
    private Long personId;

    @ManyToOne
    @JoinColumn(name = "company_id")
    private Company company;
}

https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/UniqueConstraint.html

另一方面,为了确保字段值是唯一的,您可以编写

@Column(unique=true)
String username;

对我来说,添加@Column(name = "column_name", length = 11, unique = true)起作用了

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

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

   }

仅用于创建组合键的唯一约束,该组合键将是唯一的。它将表表示为主键组合为唯一键。