我有一个Java bean。现在,我想确保该字段应该是唯一的。 我使用以下代码:
@UniqueConstraint(columnNames={"username"})
public String username;
但是我收到了一些错误:
@UniqueConstraint is dissallowed for this location
使用唯一约束的正确方法是什么?
注意:我正在使用Play框架。
答案 0 :(得分:360)
要确保字段值是唯一的,您可以编写
@Column(unique=true)
String username;
@UniqueConstraint注释用于在表级注释多个唯一键,这就是将其应用于字段时出错的原因。
参考文献(JPA TopLink):
答案 1 :(得分:100)
您可以在课程级别使用以下语法
@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"username"})})
public class SomeEntity {
@Column(name = "username")
public String username;
}
答案 2 :(得分:35)
我目前正在使用play框架和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;
}
希望它有所帮助。
答案 3 :(得分:18)
注意:在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)
答案 4 :(得分:6)
@Entity
@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames = "column1"),@UniqueConstraint(columnNames = "column2")})
- 这里Column1和Column2分别作为唯一约束。 例如:如果column1或column2值的值匹配,那么你将得到UNIQUE_CONSTRAINT错误。
@Entity
@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames ={"column1","column2"})})
- 此处,column1和column2组合值都充当唯一约束
答案 5 :(得分:4)
@Entity @Table(name = "stock", catalog = "mkyongdb",
uniqueConstraints = @UniqueConstraint(columnNames =
"STOCK_NAME"),@UniqueConstraint(columnNames = "STOCK_CODE") }) public
class Stock implements java.io.Serializable {
}
仅用于创建复合键的唯一约束,它将是唯一的。它将表格表示为组合为唯一的主键。
答案 6 :(得分:4)
@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;
答案 7 :(得分:3)
您可以在类级别使用@UniqueConstraint,用于表中的组合主键。例如:
@Entity
@Table(name = "PRODUCT_ATTRIBUTE", uniqueConstraints = {
@UniqueConstraint(columnNames = {"PRODUCT_ID"}) })
公共类ProductAttribute {}
答案 8 :(得分:2)
当唯一约束仅基于一个字段时,我们可以在该列上使用 @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 :(得分:0)
唯一注释应放在属性声明的正上方。 UniqueContraints进入数据类声明上方的@Table注释。见下文:
minnndist(X3) # Observed min. nearest neighbour dist.
#> [1] 0.1018068
答案 10 :(得分:0)
length 属性的值必须大于或等于 name 属性的长度,否则抛出错误。
作品
@Column(name = "typ e", length = 4, unique = true)
private String type;
不起作用,type.length: 4 != length 属性: 3
@Column(name = "type", length = 3, unique = true)
private String type;
答案 11 :(得分:0)
对我来说添加 @Column(name = "column_name", length = 11, unique = true)
有效