Java中的@UniqueConstraint注解
我有一个Java bean。现在,我想确保该字段应该是唯一的。
我正在使用以下代码:
@UniqueConstraint(columnNames={"username"})
public String username;
但我收到一些错误:
@UniqueConstraint is dissallowed for this location
使用唯一约束的正确方法是什么?
注意:我正在使用play框架。
I have a Java bean. Now, I want to be sure that the field should be unique.
I am using the following code:
@UniqueConstraint(columnNames={"username"})
public String username;
But I'm getting some error:
@UniqueConstraint is dissallowed for this location
What's the proper way to use unique constraints?
Note: I am using play framework.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(13)
注意:在 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)
方式1:
@Entity
@Table(name = "table_name",
uniqueConstraints={
@UniqueConstraint(columnNames = "column1"),
@UniqueConstraint(columnNames = "column2")
}
)
->这里 Column1 和 Column2 分别充当唯一约束。
例如:如果任何时候column1 或column2 值匹配,那么您将收到 UNIQUE_CONSTRAINT 错误。
方式2:
@Entity
@Table(name = "table_name",
uniqueConstraints={@UniqueConstraint(columnNames ={"column1","column2"})})
->这里,column1 和column2 组合值都充当唯一约束
@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)
唯一的注释应放置在属性声明的正上方。
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?,
)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
为了确保字段值是唯一的,您可以编写
@UniqueConstraint 注释用于在表级别注释多个唯一键,这就是将其应用于字段时出现错误的原因。
参考文献 (JPA TopLink):
To ensure a field value is unique you can write
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):