坚持最高

通过参考资料开始使用Spring Data JPA学习Spring Data JPA课程:

1188金宝搏亚洲

1.介绍

在本教程中,我们将讨论使用以下方法定义唯一约束JPA和Hibernate

首先,我们将讨论惟一约束以及它们与主键约束的区别。

接下来,我们将研究JPA的重要注释—@列(独特= true)@UniqueConstraint。我们将实现它们来定义单个列和多个列上的惟一约束。

最后,我们将看到如何在引用的表列上定义惟一约束。

2.独特的约束

让我们先快速回顾一下。唯一键是表中唯一标识数据库表中的记录的单个或多个列的集合。

惟一约束和主键约束都为列或列集的惟一性提供了保证。

2.1.它与主键约束有何不同?

惟一约束确保列或列组合中的数据对于每一行都是惟一的。例如,表的主键作为隐式唯一约束。因此,主键约束自动具有唯一约束。

而且,每个表只能有一个主键约束。但是,每个表可以有多个惟一的约束。
简单地说,唯一约束适用于主键映射所包含的任何约束。

我们定义的惟一约束将在创建表期间使用,以生成适当的数据库约束,也可以在运行时用于订购插入更新,或删除语句。

2.2.什么是单列和多列约束?

唯一约束可以是列约束,也可以是表约束。在表级,我们可以跨多个列定义惟一的约束。

JPA允许我们在代码中使用@ column(独特= true)@UniqueConstraint这些注释由模式生成过程解释,自动创建约束。

首先,我们要强调这一点列级约束应用于单个列,表级约束应用于整个表。

我们将在下一节通过示例详细讨论这些内容。

3.建立实体

一个实体表示存储在数据库中的表。实体的每个实例代表表中的一行。

让我们从创建一个域实体并将其映射到数据库表开始。对于本例,我们将创建一个实体:

@Entity @Table public class Person implements Serializable {@Id @GeneratedValue private Long id;私人字符串名称;私人密码字符串;私人字符串邮件;私人长personNumber;私人布尔isActive;私人字符串securityNumber;私人字符串departmentCode;@JoinColumn(name = "addressId", referencedColumnName = "id") private Address地址;//设置函数

一个地址属性的引用字段地址实体:

@Entity @Table public class Address implements Serializable {@Id @GeneratedValue private Long id;私人字符串streetAddress;//设置函数

在本教程中,我们将使用这个实体来演示我们的示例。

4.列约束

当我们准备好模型后,我们就可以实现第一个唯一约束了。

让我们考虑一下我们保存个人信息的实体。我们有一个主键id列。这个实体还持有PersonNumber不包含任何重复值。此外,我们不能定义主键,因为我们的表已经有它了。

在这种情况下,我们可以使用列唯一约束来确保在PersonNumber字段。JPA允许我们使用@ column注释的独特的属性。

在本节中,我们将首先看一看@ column注释,然后学习如何实现它。

4.1。@ column(独特= true)

注释类型用于为持久属性或字段指定映射列。

让我们看看它的定义:

@Target(value={METHOD,FIELD}) @Retention(value=RUNTIME) public @interface Column {boolean unique;/ /其他元素}

独特的属性指定列是否为唯一键。这是一条捷径UniqueConstraint注释,并且当唯一键约束只对应于单个列时非常有用。

我们将在下一节中看到如何定义它。

4.2.定义列约束

当唯一约束仅基于一个字段时,我们可以使用@ column(独特= true)在这一列。

我们定义一个唯一的约束personNumber字段:

@Column(unique=true) private Long personNumber;

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

[main] DEBUG org.hibernate.SQL - alter table Person add constraint UK_d44q5lfa9xx370jv2k7tsgsqt unique (personNumber)

类似地,如果我们想限制a要注册一个唯一的电子邮件,我们可以在电子邮件字段:

@Column(unique=true) private String email;

让我们执行模式创建过程并检查约束:

[main] DEBUG org.hibernate.SQL - alter table Person add constraint UK_585qcyc8qh7bg1fwgm1pj4fus unique (email)

虽然当我们想要在单个列上添加唯一约束时,这很有用,但有时我们可能想要在复合键上添加唯一约束——一些列的组合。要定义复合唯一键,可以使用表约束。我们将在下一节讨论这个问题。

5.表的约束

复合唯一键是由列组合而成的唯一键。要定义复合唯一键,可以在表而不是列上添加约束。JPA帮助我们使用@UniqueConstraint注释。

5.1.@UniqueConstraint注释

注释类型UniqueConstraint指定在生成的DDL(数据定义语言)中包含一个惟一的约束。

让我们看看它的定义:

@Target(value={}) @Retention(value=RUNTIME) public @interface UniqueConstraint {String name() default "";String [] columnNames ();}

正如我们看到的,的名字columnNames类型的字符串String []的注释元素,可以为UniqueConstraint注释。

在下一节中,我们将通过示例更好地了解每个参数。

5.2。定义独特的约束

让我们考虑一下我们实体。一个活动状态不应该有任何重复记录。换句话说,所包含的键不会有任何重复的值personNumberisActive.这里,我们需要添加跨多个列的惟一约束。

JPA帮助我们通过@UniqueConstraint注释。我们在@ table以下注释uniqueConstraints属性。让我们记住指定列的名称:

@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"personNumber", "isActive"})})

一旦模式生成,我们就可以验证它:

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

这里需要注意的一点是,如果我们不指定名称,它将是提供程序生成的值。从JPA 2.0开始,我们可以为唯一的约束提供一个名称:

@Table(uniqueConstraints = {@UniqueConstraint(name = "UniqueNumberAndStatus", columnNames = {"personNumber", "isActive"})})

我们也可以验证:

[main] DEBUG org.hibernate.SQL - alter table Person add constraint UniqueNumberAndStatus unique (personNumber, isActive)

这里,我们在一组列上添加了唯一约束。我们还可以添加多个惟一约束——对多个列集的惟一约束。我们将在下一节中做这个。

5.3。对单个实体的多个唯一约束

一个表可以有多个唯一的约束。在最后一节中,我们定义了复合键的唯一约束:personNumberisActive的地位。在本节中,我们将添加对组合的约束securityNumberdepartmentCode

让我们收集惟一索引并立即指定它们。我们通过重复来实现@UniqueConstraint注释用大括号括起来,用逗号分隔:

@Table(uniqueConstraints = {@UniqueConstraint(name = "UniqueNumberAndStatus", columnNames = {"personNumber", "isActive"}), @UniqueConstraint(name = "UniqueSecurityAndDepartment", columnNames = {"securityNumber", "departmentCode"})}))

现在,让我们看看日志并检查约束条件:

[main] DEBUG org.hibernate.SQL - alter table Person add constraint UniqueNumberAndStatus unique (personNumber, isActive) [main] DEBUG org.hibernate.SQL - alter table Person add constraint UniqueNumberAndStatus unique (securityNumber, departmentCode)

到目前为止,我们在同一个实体的字段上定义了唯一的约束。然而,在某些情况下,我们可能引用了来自其他实体的字段,需要确保这些字段的唯一性。我们将在下一节讨论这个问题。

6.引用表列的唯一约束

当我们创建两个或多个相互关联的表时,它们通常通过一个表中的一列引用另一个表的主键而相互关联。该列称为“外键”。例如,地址实体通过addressId字段。因此,addressId作为引用的表列。

我们可以在引用的列上定义唯一的约束我们将首先在单个列上实现它,然后在多个列上实现它。

6.1.单列的约束

在我们的Entity,我们有地址字段,它引用地址实体。一个应该有一个唯一的地址。

那么,我们定义一个唯一的约束条件地址场的

@Column(unique = true) private Address地址;

现在,让我们快速检查一下这个约束条件:

[main] DEBUG org.hibernate.SQL - alter table Person add constraint UK_7xo3hsusabfaw1373oox9uqoe unique (address)

我们还可以在引用的表列上定义多个列约束,我们将在下一节中看到。

6.2。多个列的约束

我们可以在列的组合上指定唯一的约束。如前所述,我们可以使用表约束来做到这一点。

让我们定义唯一的约束personNumber地址把它加到uniqueConstraints数组:

@Entity @Table(uniqueConstraints = //其他约束@UniqueConstraint(name = "UniqueNumberAndAddress", columnNames = {"personNumber", "address"})})

最后,让我们看看唯一的约束条件:

[main] DEBUG org.hibernate.SQL - alter table Person add constraint UniqueNumberAndAddress unique (personNumber, address)

7.结论

唯一约束阻止两个记录在一个列或一组列中具有相同的值。

在本教程中,我们了解了如何在JPA中定义惟一约束。首先,我们回顾一下唯一约束。此外,我们讨论了@ column(独特= true)@UniqueConstraint分别在单个列和多个列上定义唯一约束的注释。

与往常一样,本文中的示例是可用的在GitHub

坚持下
通过参考资料开始使用Spring Data JPA学习Spring Data JPA课程:1188金宝搏亚洲
客人
0评论
内联反馈
查看所有评论