1. 简介

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

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

然后,我们将看看JPA的重要注释@Column(unique=true)@UniqueConstraint。我们将实现它们以定义对单个列和多个列的唯一约束。

最后,我们将学习如何在引用的表列上定义唯一约束。

2. 独特的约束

让我们从快速回顾开始。唯一键是表中的一组单列或多列,用于唯一标识数据库表中的记录。

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

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

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

此外,每个表只能有一个主键约束。但是,每个表可以有多个唯一约束。
简而言之,除了主键映射所需的任何约束之外,还应用唯一约束。

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

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

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

JPA 允许我们使用@Column(unique=true)and@UniqueConstraint在代码中定义唯一的约束。这些批注由架构生成过程解释,自动创建约束。

首先,我们应该强调列级约束适用于单个列,表级约束适用于整个表。

我们将在下一节中更详细地讨论这一点。

3. 设置实体

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

让我们首先创建一个域实体并将其映射到数据库表。对于此示例,我们将创建一个Person实体:

@Entity
@Table
public class Person implements Serializable {@Id@GeneratedValueprivate Long id;  private String name;private String password;private String email;private Long personNumber;private Boolean isActive;private String securityNumber;private String departmentCode;@JoinColumn(name = "addressId", referencedColumnName = "id")private Address address;//getters and setters}

地址字段是地址实体中的引用字段:

@Entity
@Table
public class Address implements Serializable {@Id@GeneratedValueprivate Long id;private String streetAddress;//getters and setters
}

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

4. 列约束

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

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

在这种情况下,我们可以使用列唯一约束来确保在PersonNumber字段中没有输入重复值。JPA 允许我们使用具有唯一属性的@Column注释来实现这一点。

在以下部分中,我们将了解@Column注释,然后学习如何实现它。

4.1.@Column(unique=true)

批注类型Column用于指定持久性属性或字段的映射列。

我们来看看定义:

@Target(value={METHOD,FIELD})
@Retention(value=RUNTIME)
public @interface Column {boolean unique;//other elements}

唯一属性指定列是否为唯一键。这是UniqueConstraint注释的快捷方式,当唯一键约束仅对应于单个列时非常有用。

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

4.2. 定义列约束

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

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

@Column(unique=true)
private Long personNumber;

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

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

同样,如果我们想限制一个人使用唯一的电子邮件注册,我们可以在电子邮件字段上添加一个唯一的约束:

@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();
}

如我们所见,String String[] 类型的名称和列名称分别是可以为UniqueConstraint注释指定的注释元素。

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

5.2. 定义唯一约束

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

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

@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状态。在本节中,我们将添加对安全编号部门代码组合的约束。

让我们收集我们的唯一索引并立即指定它们。我们通过在大括号中重复@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 UniqueSecurityAndDepartment unique (securityNumber, departmentCode)

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

6. 引用表列的唯一约束

当我们创建两个或多个相互关联的表时,它们通常通过一个表中引用另一个表的主键的列来关联。该列称为“外键”。例如,“人员”和“地址”实体通过addressId字段进行连接。因此,地址 ID充当引用的表列。

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

6.1. 单列约束

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

因此,让我们在Person 的地址字段上定义一个唯一的约束:

@Column(unique = true)
private Address address;

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

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

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

6.2. 多列约束

我们可以对列的组合指定唯一的约束。如前所述,我们可以使用表约束来执行此操作。

让我们定义personNumber和地址的唯一约束并将其添加到uniqueConstraint数组中:

@Entity
@Table(uniqueConstraints = { //other constraints@UniqueConstraint(name = "UniqueNumberAndAddress", columnNames = { "personNumber", "address" })})

最后,让我们看看独特的约束:

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

7. 结论

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

在本文中,我们学习了如何在 JPA 中定义唯一约束。首先,我们对独特的约束进行了一些回顾。然后我们讨论了@Column(unique=true)@UniqueConstraint注释,分别定义了对单个列和多个列的唯一约束。

与往常一样,本文中的示例可在GitHub 上找到。

在 JPA 中定义唯一约束相关推荐

  1. mysql 定义唯一约束_在MySQL中,定义唯一约束的基本语法格式是【】

    在MySQL中,定义唯一约束的基本语法格式是[] 答:NOT NULL 中国制定全面抗战路线的会议是( ) 答:洛川会议 中国大学MOOC:\精确制导武器包括和()两大类武器.\; 答:\精确制药\& ...

  2. SQL Server 2012 唯一约束(定义唯一约束、删除唯一约束)

    文章目录 准备知识 定义唯一约束 使用SSMS工具定义唯一约束 使用SQL方式定义唯一约束 方式一:在创建数据表的时候定义唯一约束 方式二:修改数据表定义唯一约束 删除唯一约束 使用SSMS工具删除唯 ...

  3. mysql 表中添加唯一约束

    mysql表中添加唯一约束 在做权限系统中,有一张表叫用户角色关系表(user_role_relation),这张表中有user_id 和role_id(建表语句如下). CREATE TABLE u ...

  4. mysql用唯一约束避免重复_mysql中创建唯一约束防止数据重复

    针对数据重复插入的情况,我们通常会在业务代码中进行处理,就是说入库的时候先查一遍有没有,没有记录的情况再准许入库.但是如果只是自己处理业务代码时先查后入库,并发高时会发生意想不到的后果. 比如现在表t ...

  5. mysql联合唯一约束_MySQL中添加唯一约束和联合唯一约束

    在MySQL数据库中,经常会碰到由于业务需要添加唯一键约束,唯一键约束,可以在一个列上添加约束,也可以在多个列上添加唯一约束. 一.单列唯一约束 在一列上添加唯一约束,主要是让该列在表中只能有唯一的一 ...

  6. MySQL中添加唯一约束和联合唯一约束

    在MySQL数据库中,经常会碰到由于业务需要添加唯一键约束,唯一键约束,可以在一个列上添加约束,也可以在多个列上添加唯一约束. 一.单列唯一约束 在一列上添加唯一约束,主要是让该列在表中只能有唯一的一 ...

  7. navicat设置表中字段唯一约束

    首先进入设计表: 如下界面点击索引: 如下设置: 栏位选择想要唯一约束的字段 点击保存即可

  8. SQL Server中唯一索引和唯一约束之间的区别

    This article gives you an overview of Unique Constraints in SQL and also the Unique SQL Server index ...

  9. MySQL唯一约束(UNIQUE KEY)

    MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值.唯一约束可以确保一列或者几列不出现重复值. 在创建表时设置唯一约束 在定义完列之后直接使用 UNIQUE 关键字指 ...

最新文章

  1. pb设置Oracle事务的隔离级别,Oracle的事务隔离级别
  2. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )
  3. jquery学习手记(1)
  4. 判断一棵二叉树是否为平衡二叉树
  5. Codeforces 600E Lomsat gelral (树上启发式合并)
  6. CSS那些不大不小的事
  7. Python学习笔记:过滤N位数并绘制折线图
  8. 033-Unit 11 Advanced Uses of the vi Editors
  9. (转载)Vim入门图解说明
  10. 计算机的英语对话,英语口语对话:谈论电脑
  11. 为什么好的程序员会写出糟糕的单元测试?
  12. 软件测试经典问题——NextDate函数
  13. neo4j图数据库导入scv文件
  14. 华为网络设备-访问控制列表配置实验
  15. 如何在服务器上运行Recorder.js,录音上传到服务器使用jwagener的recorder.js和recorder.swf...
  16. 「LCA」[USACO10HOL]牛的政治Cow Politics
  17. 2020年华中师范大学计算机考研经验分享
  18. TaintDroid剖析之DVM变量级污点跟踪(下篇)
  19. 新浪服务器mysql_php新浪云链接mysql与storage
  20. vs2010没有新建项目的解决方法

热门文章

  1. 关于斐波那契数列那些事儿~
  2. 打造绿色数据中心,Colt DCS 是认真的!
  3. 谷从何来,歌向何去——Google产品策略分析
  4. K-均值聚类算法(Python,机器学习 ,绘图)
  5. 关于 imtra-mart 的 新研究
  6. MySQL安装时的配置文件my.ini参考
  7. 如何引爆手淘首页流量,手淘首页流量获取玩法
  8. .net通过S7.net读写西门子PLC中,字符串,bool,整数,小数及byte型
  9. mysql temporary_MySQL中临时表(TEMPORARY)
  10. Redis安装教程(详细)