在JPA中定义独特的约束
最后修改:6月3日,2021年
1.介绍
在本教程中,我们将讨论使用独特的约束使用JPA和Hibernate.。
首先,我们将讨论唯一的约束以及它们与主要关键约束的不同。
接下来,我们将看看JPA的重要注释 - @列(唯一= TRUE)和@unqueconstraint。我们将实现它们以在单个列和多列上定义唯一的约束。
最后,我们将看到如何在引用的表列上定义唯一的约束。
2.独特的约束
让我们从快速重拍开始。唯一密钥是一组表的单个或多列,唯一地标识数据库表中的记录。
唯一和主要的密钥约束都为列或一组列提供了唯一性的保证。
2.1。它与主要密钥约束不同?
唯一的约束确保列中的数据或列的组合对于每行是唯一的。例如,表的主键,用作隐式唯一约束。因此,主键约束自动具有唯一的约束。
此外,我们可以为每个表只能有一个主键约束。然而,可以有每个表中的多个唯一约束。
简单地说,唯一约束适用于除了通过主键映射entailed任何约束。
我们定义的唯一约束表创建过程中用来产生正确的数据库限制,并且还可以在运行时使用顺序插入那更新, 或者删除陈述。
2.2。什么是单列和多列约束?
唯一约束可以是列约束或表约束。在表格级别,我们可以在多个列中定义唯一的约束。
JPA允许我们在代码中定义唯一的约束@column(unique = true)和@unqueconstraint.。这些注释由模式生成过程解释,自动创建约束。
在其他任何事情之前,让我们强调这一点列级约束应用于单个列,表级约束适用于整个表。
我们将通过实例讨论这些具体在下面的章节。
3.建立一个实体
一个实体在JPA中表示存储在数据库中的表。实体的每个实例都表示表中的一行。
让我们首先创建域实体并将其映射到数据库表。对于这个例子,我们将创建一个人实体:
@entity @Table公共类人实现序列化{@Id @GeneratedValue私人长期ID;私有字符串名称;私有字符串密码;私有字符串电子邮件;私人长人物;私人布尔·托运;私有字符串SecurityNumber;私有字符串部门代码;@joincolumn(name =“addressid”,引用columnName =“ID”)私有地址地址;// getters和setter}
一个地址字段是来自的引用领域地址实体:
@entity @Table公共类地址实现序列化{@Id @GeneratedValue私人长ID;私人串街套;// getters和setter}
在整个本教程中,我们将使用此方法人实体展示我们的例子。
4.列约束
当我们准备好我们的模型时,我们可以实现我们的第一个独特的约束。
让我们考虑我们的人拥有该人的信息的实体。我们有一个主要的钥匙ID柱子。这个实体也持有人人数这不包含任何重复值。此外,我们无法定义主键,因为我们的表已经拥有它。
在这种情况下,我们可以使用列唯一的约束来确保在a中输入没有重复值人人数场地。JPA允许我们使用的是使用@柱子注释与独特的属性。
在本节中,我们将首先看看@柱子注释然后了解如何实现它。
4.1。@column(unique = true)
注释类型柱子用于为一个持久的属性或字段指定被映射的列。
让我们来看看定义:
@target(value = {method,field})@retention(value =运行时)public @interface列{boolean unique;//其他元素}
这独特的属性指定列是一个唯一的键。这是一个捷径的UniqueConstraint注释并且在唯一的密钥约束对应于单个列时是有用的。
我们将在下一节中看到如何定义它。
4.2。定义列约束
只要唯一的约束仅基于一个字段,我们就可以使用@column(unique = true)在那一列。
让我们定义一个独特的约束人人数场地:
@Column(唯一=真)私人龙personNumber;
当我们执行架构创建过程时,我们可以从日志验证它:
[主] DEBUG org.hibernate.SQL - ALTER TABLE人添加约束UK_d44q5lfa9xx370jv2k7tsgsqt独特(personNumber)
同样,如果我们想限制一个人要注册唯一的电子邮件,我们可以为此添加一个独特的约束电子邮件场地:
@column(unique = true)私有字符串电子邮件;
让我们执行架构创建过程并检查约束:
[main] debug org.hibernate.sql - Alter表人添加约束UK_585QCYC8QH7BG1FWGM1PJ4Fus唯一(电子邮件)
虽然当我们想要在单个列上置于一个唯一的约束时,但有时我们可能希望在复合键上添加唯一的约束 - 列的某些组合。要定义复合唯一密钥,我们可以使用表约束。我们将在下一节讨论。
5.表约束
复合唯一密钥是由列组合组成的唯一密钥。要定义复合唯一密钥,我们可以在表上添加约束而不是列。JPA有助于我们实现它@unqueconstraint.注解。
5.1。@unqueconstraint.注解
注释类型的UniqueConstraint指定唯一约束将包含在表的生成的DDL(数据定义语言)中。
让我们来看看定义:
@target(value = {})@retention(value =运行时)public @interface unqueconstraint {string name()默认值“”;string [] columnnames();}
我们看到,这姓名和列名称类型细绳和细绳[]分别是可以为之指定的注释元素的UniqueConstraint注解。
我们将更好地查看下一节中的每个参数,通过示例。
5.2。定义唯一约束
让我们考虑我们的人实体。一种人不应有活动状态的任何重复记录。换句话说,包括包含的密钥的任何重复值人人数和活跃。在这里,我们需要添加跨越多列的唯一约束。
JPA有助于我们实现这一目标@unqueconstraint.注解。我们这样做@桌子注释下unqueconstraints.属性。让我们记住指定列的名称:
@table(uniqueConstraints = {@UniqueConstraint(COLUMNNAMES = { “personNumber”, “isActive”})})
我们可以在生成模式后验证:
[main] debug org.hibernate.sql - Alter表人添加约束UK5E0BV5ARHH7JJHSLS27BMQP4A唯一(PersonNumber,Isactive)
请注意,这里是指我们未指定名称,它是一种提供者生成的值。由于JPA 2.0,我们可以为我们的唯一约束提供一个名字:
@table(uniqueConstraints = {@UniqueConstraint(名称= “UniqueNumberAndStatus”,COLUMNNAMES = { “personNumber”, “isActive”})})
我们可以验证相同的验证:
[main] debug org.hibernate.sql - Alter表人添加约束UniquenumberAndStatus唯一(PersonNumber,Isactive)
在这里,我们在一组列中添加了唯一的约束。我们还可以在多组列上添加多个唯一约束 - 唯一约束。我们将在下一节中做到这一点。
5.3。单个实体上的多个独特约束
表格可以具有多个唯一的约束。在最后一节中,我们在Composite密钥上定义了唯一的约束:人人数和活跃地位。在本节中,我们将在组合添加约束安全号码和部门代码。
让我们收集我们唯一的索引并立即指定它们。我们通过重复这样做@unqueconstraint.注释在括号和由逗号分隔:
@table(uniqueConstraints = {@UniqueConstraint(名称= “UniqueNumberAndStatus”,COLUMNNAMES = { “personNumber”, “isActive”}),@UniqueConstraint(名称= “UniqueSecurityAndDepartment”,COLUMNNAMES = { “保险号”, “departmentCode”})})
现在,让我们看到了日志和检查约束:
[main] debug org.hibernate.sql - Alter表人添加约束UniquenumberAndStatus唯一(PersonNumber,Isactive)[main] debug org.hibernate.sql - Alter表人添加约束UniquesecurityAnddepartment唯一(SecurityNumber,部门代码)
到目前为止,我们在同一实体中的字段上定义了唯一的约束。但是,在某些情况下,我们可能具有来自其他实体的引用字段,并需要确保这些领域的唯一性。我们将在下一节讨论。
6.上的引用的表列唯一约束
当我们创建与彼此相关的两个或更多个表时,它们通常由一个表中的列相关,引用另一个表的主键。该列称为“外键”。例如,人和地址实体通过了地址场地。因此,地址充当引用的表列。
我们可以在引用的列上定义唯一的约束。我们将首先在单个列中实现它,然后在多列上实现。
6.1。单列约束
在我们的人实体,我们有一个地址指的领域是指的地址实体。一种人应该有一个唯一的地址。
所以,让我们定义的唯一约束地址场面的领域人:
@column(unique = true)私有地址;
现在,让我们快速检查这个约束:
[main] debug org.hibernate.sql - Alter表人添加约束UK_7XO3HSUSABFAW1373OOX9UQOE唯一(地址)
我们还可以在引用的表列上定义多个列约束,因为我们将在下一节中看到。
6.2。多列约束
我们可以在列的组合指定唯一约束。如前所述,我们可以使用表约束这样做。
让我们来定义上的唯一约束人人数和地址并把它添加到unqueconstraints.大批:
@entity @table(Unqueconstraints = //其他约束@unqueconstraint(name =“uniquenumberandddress”,columnnames = {“personnumber”,“地址”})})
最后,让我们看到了唯一约束:
[main] debug org.hibernate.sql - Alter表人添加约束UniquenumberAdaddress唯一(PersonNumber,地址)
7.结论
唯一的约束可以防止两个记录在列或一组中具有相同的值。
在本教程中,我们看到我们如何定义JPA中的独特约束。首先,我们做了一点回顾了独特的约束。此外,我们讨论过@column(unique = true)和@unqueconstraint.注释分别为单个列和多列定义唯一约束。
一如既往,可以使用本文的示例在github上。