仓库
本章解释了 Spring Data 仓库的基本基础和 Cassandra 的特性。在继续讨论 Cassandra 的特性之前,请确保您对基本概念有清晰的理解。
Spring Data 仓库抽象的目标是显著减少实现各种持久化存储的数据访问层所需的样板代码量。
章节摘要
📄️ 核心概念
Spring Data 仓库抽象中的核心接口是 Repository。它作为类型参数接受要管理的领域类以及领域类的标识符类型。此接口主要充当标记接口,用于捕获要处理的类型,并帮助您发现扩展此接口的接口。
📄️ 定义仓库接口
要定义一个仓库接口,首先需要定义一个特定于域类的仓库接口。该接口必须扩展 Repository,并且指定域类和 ID 类型。如果你想为该域类型暴露 CRUD 方法,可以扩展 CrudRepository,或者它的变种,而不是 Repository。
📄️ Cassandra 仓库
要访问存储在 Apache Cassandra 中的域实体,您可以使用 Spring Data 的高级仓库支持,这极大地简化了 DAO 的实现。为此,创建一个仓库接口,如以下示例所示:
📄️ 创建仓库实例
本节介绍如何为定义的存储库接口创建实例和 bean 定义。
📄️ 定义查询方法
存储库代理有两种方式可以根据方法名推导出特定于存储的查询:
📄️ Cassandra 特定查询方法
大多数情况下,您在存储库上触发的数据访问操作会导致对 Apache Cassandra 数据库执行查询。定义这样的查询只需在存储库接口上声明一个方法。以下示例显示了多个这样的方式声明:
📄️ 投影
Spring Data 查询方法通常返回由仓库管理的聚合根的一个或多个实例。然而,有时可能希望基于这些类型的某些属性创建投影。Spring Data 允许建模专门的返回类型,以便更有选择性地检索托管聚合的部分视图。
📄️ 自定义仓库实现
Spring Data 提供了多种选项来创建查询方法,几乎不需要编码。但当这些选项不符合您的需求时,您也可以为存储库方法提供自己的自定义实现。本节将描述如何做到这一点。
📄️ 从聚合根发布事件
由仓库管理的实体是聚合根。在领域驱动设计应用中,这些聚合根通常会发布领域事件。Spring Data 提供了一个注解 @DomainEvents,你可以在聚合根的方法上使用这个注解,使得发布领域事件变得尽可能简单,以下是一个示例:
📄️ 仓库方法的空值处理
截至 Spring Data 2.0,返回单个聚合实例的仓库 CRUD 方法使用 Java 8 的 Optional 来指示值可能不存在。除此之外,Spring Data 支持在查询方法中返回以下包装类型:
📄️ CDI 集成
实例化仓库接口通常由容器创建,Spring 容器是使用 Spring Data 时最自然的选择。Spring Data for Apache Cassandra 随附一个自定义的 CDI 扩展,允许在 CDI 环境中使用仓库抽象。该扩展是 JAR 文件的一部分。要激活它,只需将 Spring Data for Apache Cassandra JAR 文件放入类路径中。现在,您可以通过实现 CassandraTemplate 的 CDI Producer 来设置基础设施,如以下示例所示:
📄️ 仓库查询关键词
下表列出了 Spring Data 存储库查询派生机制通常支持的主题关键字,用于表达谓词。请查阅特定存储的文档以获取支持的确切关键字列表,因为这里列出的一些关键字可能在某些存储中不受支持。
📄️ 仓库查询返回类型
以下表格列出了 Spring Data 仓库通常支持的返回类型。然而,请查阅特定存储的文档以获取支持的返回类型的确切列表,因为此处列出的一些类型在特定存储中可能不受支持。