ChatGPT解决这个技术问题 Extra ChatGPT

Java中的@UniqueConstraint注解

我有一个Java bean。现在,我想确保该字段应该是唯一的。

我正在使用以下代码:

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

但是我遇到了一些错误:

@UniqueConstraint is dissallowed for this location

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

注意:我正在使用播放框架。

“但我遇到了一些错误。”始终指定您在问题中遇到的错误。您有相关信息可能会很好地帮助我们解决您的问题 - 不要自己保密。
可以使用@id 注释吗?
精彩的评论 Jon Skeet,让我很开心!

p
pimlottc

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

@Column(unique=true)
String username;

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

参考资料(JPA TopLink):

@UniqueConstraint

@柱子


重要的是要注意它只有在让 JPA 创建表时才有效
D
Divanshu

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

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

S
Stephan

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

注意: 在 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 - 这确实改善了答案!
M
Manjunath H M

方式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 组合值都充当唯一约束


T
TanvirChowdhury

@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;

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

   }

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


o
oura2

定义列约束

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

A
Apostolos

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

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

J
Joshua Taylor

唯一的注释应该放在属性声明的正上方。 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?,
)

A
Angel Quiroz Soriano

长度属性的值必须大于或等于名称属性长度,否则抛出错误。

作品

@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;

P
PKS

对我来说,添加 @Column(name = "column_name", length = 11, unique = true) 有效