JPA
本章指出了 JPA 存储库支持的特殊之处。这是基于 Working with Spring Data Repositories 中解释的核心存储库支持构建的。请确保您对其中解释的基本概念有充分的理解。
章节摘要
📄️ 入门指南
一个简单的引导设置工作环境的方法是通过 start.spring.io 创建一个基于 Spring 的项目,或者在 Spring Tools 中创建一个 Spring 项目。
📄️ 核心概念
Spring Data 仓库抽象中的核心接口是 Repository。它接受要管理的领域类以及领域类的标识符类型作为类型参数。这个接口主要作为一个标记接口,用于捕获要处理的类型,并帮助你发现扩展这个接口的其他接口。
📄️ 定义仓库接口
要定义仓库接口,首先需要定义一个特定于领域类的仓库接口。该接口必须扩展 Repository,并且需要指定领域类和 ID 类型。如果你想为该领域类型暴露 CRUD 方法,可以扩展 CrudRepository 或其变体,而不是 Repository。
📄️ 配置
本节介绍通过以下方式配置 Spring Data JPA:
📄️ 持久化实体
本节介绍如何使用 Spring Data JPA 持久化(保存)实体。
📄️ 定义查询方法
仓库代理有两种方式可以从方法名中派生出特定于存储的查询:
📄️ JPA 查询方法
本节介绍了使用 Spring Data JPA 创建查询的各种方式。
📄️ 值表达式基础
值表达式是 Spring 表达式语言 (SpEL) 和属性占位符解析的结合体。它们将强大的程序化表达式评估与简单易用的属性占位符解析相结合,以便从环境(如配置属性)中获取值。
📄️ 投影
Spring Data 查询方法通常返回由仓库管理的聚合根的一个或多个实例。然而,有时可能希望基于这些类型的某些属性创建投影。Spring Data 允许建模专用的返回类型,以便更有选择性地检索被管理聚合的部分视图。
📄️ 存储过程
JPA 2.1 规范引入了通过使用 JPA 条件查询 API 调用存储过程的支持。我们引入了 @Procedure 注解,用于在仓库方法上声明存储过程的元数据。
📄️ 规格说明
JPA 2 引入了一个 Criteria API,您可以使用它以编程方式构建查询。通过编写 criteria,您可以为领域类定义查询的 where 子句。更进一步来看,这些 criteria 可以被视为由 JPA Criteria API 约束所描述的实体上的谓词。
📄️ 按示例查询
本章介绍了按示例查询(Query by Example),并解释了如何使用它。
📄️ 事务性
默认情况下,从 CrudRepository 继承的方法会继承 SimpleJpaRepository 中的事务配置。对于读取操作,事务配置中的 readOnly 标志会被设置为 true。其他所有方法则配置为普通的 @Transactional,以便应用默认的事务配置。由事务性仓库片段支持的仓库方法会继承实际片段方法中的事务属性。
📄️ 锁定
要指定使用的锁定模式,您可以在查询方法上使用 @Lock 注解,如下例所示:
📄️ 审计
Spring Data 提供了复杂的支持,以透明地跟踪谁创建或更改了实体以及更改发生的时间。要利用该功能,您必须为实体类配备审计元数据,这些元数据可以通过注解或实现接口来定义。此外,必须通过注解配置或 XML 配置来启用审计,以注册所需的基础设施组件。有关配置示例,请参阅特定存储部分。
📄️ 合并持久化单元
Spring 支持拥有多个持久化单元。然而,有时你可能希望模块化你的应用程序,但仍然确保所有这些模块在单个持久化单元中运行。为了实现这种行为,Spring Data JPA 提供了一个 PersistenceUnitManager 实现,它会根据持久化单元的名称自动合并它们,如下例所示:
📄️ CDI 集成
仓库接口的实例通常由容器创建,而在使用 Spring Data 时,Spring 是最自然的选择。Spring 提供了创建 Bean 实例的复杂支持,具体文档可参考\[创建仓库实例]\(Creating Repository Instances)。从 1.1.0 版本开始,Spring Data JPA 附带了一个自定义的 CDI 扩展,允许在 CDI 环境中使用仓库抽象。该扩展是 JAR 文件的一部分。要激活它,请将 Spring Data JPA JAR 包含在类路径中。
📄️ 自定义存储库实现
Spring Data 提供了多种选项来创建查询方法,而无需编写大量代码。但是,当这些选项无法满足你的需求时,你还可以为仓库方法提供自定义的实现。本节将介绍如何做到这一点。
📄️ 从聚合根发布事件
由仓库管理的实体是聚合根。在领域驱动设计(Domain-Driven Design)应用程序中,这些聚合根通常会发布领域事件。Spring Data 提供了一个名为 @DomainEvents 的注解,你可以将其用于聚合根的方法上,以便尽可能简化事件的发布,如下例所示:
📄️ 仓库方法的空值处理
自 Spring Data 2.0 起,返回单个聚合实例的仓库 CRUD 方法使用 Java 8 的 Optional 来表示可能缺失的值。除此之外,Spring Data 还支持在查询方法中返回以下包装类型:
📄️ Spring Data 扩展
本节记录了一组 Spring Data 扩展,这些扩展使得 Spring Data 可以在各种上下文中使用。目前,大多数集成都是针对 Spring MVC 的。
📄️ 仓库查询关键词
下表列出了 Spring Data 存储库查询派生机制通常支持的主题关键字,用于表达谓词。由于某些列出的关键字可能在特定存储中不受支持,请查阅特定存储的文档以获取支持的确切关键字列表。
📄️ 仓库查询返回类型
下表列出了 Spring Data 仓库通常支持的返回类型。然而,由于某些类型可能在某些特定的存储中不被支持,因此请查阅特定存储的文档以获取确切的受支持返回类型列表。
📄️ 常见问题解答
我想获取更详细的日志信息,例如在 JpaRepository 内部调用了哪些方法。我该如何获取这些信息?
📄️ 术语表
面向切面编程