Java中的@UniqueConstraint注解
Posted
技术标签:
【中文标题】Java中的@UniqueConstraint注解【英文标题】:@UniqueConstraint annotation in Java 【发布时间】:2011-03-08 19:02:10 【问题描述】:我有一个 Java bean。现在,我想确保该字段应该是唯一的。
我正在使用以下代码:
@UniqueConstraint(columnNames="username")
public String username;
但我遇到了一些错误:
@UniqueConstraint is dissallowed for this location
使用唯一约束的正确方法是什么?
注意:我正在使用游戏框架。
【问题讨论】:
“但我遇到了一些错误。” 总是 指定您在问题中遇到的错误。您有相关信息可以很好地帮助我们解决您的问题 - 不要自己保密。 可以使用@id注解吗? 精彩的评论 Jon Skeet,让我开心! 【参考方案1】:为了确保字段值是唯一的,您可以编写
@Column(unique=true)
String username;
@UniqueConstraint 注释用于在表级别注释多个唯一键,这就是将其应用于字段时出错的原因。
参考资料(JPA TopLink):
@UniqueConstraint @Column【讨论】:
重要的是要注意它只有在让 JPA 创建表时才有效【参考方案2】:您可以使用以下语法在类级别使用
@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames="username"))
public class SomeEntity
@Column(name = "username")
public String username;
【讨论】:
【参考方案3】:我目前也在使用带有 hibernate 和 JPA 2.0 注释的播放框架,这个模型可以正常工作
@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;
希望对您有所帮助。
【讨论】:
我希望你在现实生活中不要使用这些字段进行编码;) 当然不是,但我确实会用这些字段编写示例:D【参考方案4】:注意:在 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)
【讨论】:
感谢@Larrikin - 这确实改善了答案!【参考方案5】:方式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 的组合值都充当唯一约束
【讨论】:
【参考方案6】: @Entity @Table(name = "stock", catalog = "mkyongdb",
uniqueConstraints = @UniqueConstraint(columnNames =
"STOCK_NAME"),@UniqueConstraint(columnNames = "STOCK_CODE") ) public
class Stock implements java.io.Serializable
唯一约束仅用于创建复合键,它将是唯一的。它将表作为主键组合为唯一。
【讨论】:
【参考方案7】:@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;
【讨论】:
【参考方案8】:定义列约束
只要唯一约束仅基于一个字段,我们就可以在该列上使用@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)
【讨论】:
【参考方案9】:您可以在类级别上使用@UniqueConstraint,用于表中的组合主键。例如:
@Entity
@Table(name = "PRODUCT_ATTRIBUTE", uniqueConstraints =
@UniqueConstraint(columnNames = "PRODUCT_ID") )
公共类 ProductAttribute
【讨论】:
【参考方案10】:唯一的注解应该放在属性声明的正上方。 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?,
)
【讨论】:
【参考方案11】:length属性的值必须大于等于name属性长度,否则会报错。
作品
@Column(name = "typ e", length = 4, unique = true)
private String type;
不起作用,type.length: 4 != length property: 3
@Column(name = "type", length = 3, unique = true)
private String type;
【讨论】:
【参考方案12】:对我来说,添加 @Column(name = "column_name", length = 11, unique = true)
有效
【讨论】:
以上是关于Java中的@UniqueConstraint注解的主要内容,如果未能解决你的问题,请参考以下文章
Heroku spring-jpa UniqueConstraint