Java中的@UniqueConstraint注释

xyz*_*xyz 153 java jpa

我有一个Java bean.现在,我想确保该字段应该是唯一的.我使用以下代码:

@UniqueConstraint(columnNames={"username"})
public String username;
Run Code Online (Sandbox Code Playgroud)

但是我收到了一些错误:

@UniqueConstraint is dissallowed for this location
Run Code Online (Sandbox Code Playgroud)

什么是使用独特约束的正确方法?

注意:我正在使用play框架.

mdm*_*dma 383

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

@Column(unique=true)
String username;
Run Code Online (Sandbox Code Playgroud)

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

参考文献(JPA TopLink):

  • 重要的是要注意,只有让JPA创建表格才会有效 (11认同)

Div*_*shu 107

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

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


Fra*_*coM 38

我目前正在使用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;

}
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助.

  • 我希望您在现实生活中不要使用这些字段进行编码;) (3认同)

Gle*_*son 19

注意:在Kotlin中,用于在注释中声明数组的语法使用arrayOf(...)而不是{...}

@Entity
@Table(uniqueConstraints=arrayOf(UniqueConstraint(columnNames=arrayOf("book", "chapter_number"))))
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)
Run Code Online (Sandbox Code Playgroud)

注意:从Kotlin 1.2开始,它可以使用[...]语法,因此代码变得更加简单

@Entity
@Table(uniqueConstraints=[UniqueConstraint(columnNames=["book", "chapter_number"])])
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)
Run Code Online (Sandbox Code Playgroud)


Man*_*H M 10

方式1:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames = "column1"),@UniqueConstraint(columnNames = "column2")})
Run Code Online (Sandbox Code Playgroud)

-这里的Column1和Column2分别充当唯一约束。例如:如果任何时候column1或column2的值匹配,那么您将收到UNIQUE_CONSTRAINT错误。

方式二:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames ={"column1","column2"})})
Run Code Online (Sandbox Code Playgroud)

-这里的column1和column2组合值都充当唯一约束


Tan*_*ury 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;
}
Run Code Online (Sandbox Code Playgroud)

https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/UniqueConstraint.html

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

@Column(unique=true)
String username;
Run Code Online (Sandbox Code Playgroud)


小智 7

定义列约束

每当唯一约束仅基于一个字段时,我们就可以对该列使用@Column(unique=true)。

让我们在personNumber字段上定义一个唯一约束:

@Column(unique=true)
private Long personNumber;
Run Code Online (Sandbox Code Playgroud)

当我们执行模式创建过程时,我们可以从日志中验证它:

[main] DEBUG org.hibernate.SQL -
    alter table Person add constraint UK_d44q5lfa9xx370jv2k7tsgsqt unique (personNumber)
Run Code Online (Sandbox Code Playgroud)

定义唯一约束

JPA 通过 @UniqueConstraint 注释帮助我们实现这一目标。我们在 uniqueConstraints 属性下的 @Table 注释中执行此操作。让我们记住指定列的名称:

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "personNumber", "isActive" }) })
Run Code Online (Sandbox Code Playgroud)

生成模式后我们可以验证它:

[main] DEBUG org.hibernate.SQL -
    alter table Person add constraint UK5e0bv5arhh7jjhsls27bmqp4a unique (personNumber, isActive)
Run Code Online (Sandbox Code Playgroud)


小智 5

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

   }
Run Code Online (Sandbox Code Playgroud)

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