Java中的@UniqueConstraint注释

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

我正在使用以下代码:

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

但是我得到了一些错误:

@UniqueConstraint is dissallowed for this location

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

我正在使用播放框架。

304842 次浏览

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

@Column(unique=true)
String username;

@UniqueConstraint注释用于在表级注释多个惟一键,这就是为什么在将其应用到字段时出现错误的原因。

引用(JPA TopLink):

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

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

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


}

希望有帮助。

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


}

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

在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)

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

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

唯一注释应该放在属性声明的正上方。 UniqueContraints进入数据类声明上面的@Table注释。见下文:< / p >

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

Way1:

@Entity
@Table(name = "table_name",
uniqueConstraints={
@UniqueConstraint(columnNames = "column1"),
@UniqueConstraint(columnNames = "column2")
}
)
< p >→在这里,columnn1和Column2分别作为唯一的约束。 例如:如果任何时候columnn1或column2的值匹配,那么你将得到UNIQUE_CONSTRAINT Error.

Way2:

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

→在这里,columnn1和column2的组合值充当唯一的约束

length属性的值必须大于或等于name attribute length,否则将抛出错误。

作品

@Column(name = "typ e", length = 4, unique = true)
private String type;

不工作,类型。长度:4 != Length属性:3

@Column(name = "type", length = 3, unique = true)
private String type;

@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(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(name = "column_name", length = 11, unique = true)起作用了

使用@UniqueConstraint时要注意:

在某些情况下(当使用MySql时),我们必须通过添加@Column(name="product_id", length = 6)来提供唯一约束中使用的列的长度,因为默认情况下Hibernate将创建具有最大大小的列(默认行为),这在MySql中创建唯一约束(Specified key was too long; max key length is 1000 bytes)时会生成一个错误