持久性顶部

打通基准开始使用Spring JPA数据学习春季数据JPA课程:

rayapp3

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上

持久性底部
打通基准开始使用Spring JPA数据学习春季数据JPA课程:rayapp3
客人
0.注释
内联反馈
查看所有评论