领先一步
VMware 提供培训和认证,助您加速提升。
了解更多Spring Data Neumann 是首个遵循新的六个月发布周期的版本。缩短的时间框架使我们能够更频繁地交付新功能,这是帮助您更快发展的关键。该版本本身包含了许多新内容,并对几个存储库进行了重要的(可能带来破坏性变化的)升级。
如下所示,由于其暴露的 API 或驱动程序中存在潜在的破坏性变更,几个存储库模块需要进行主要版本升级
Spring Data JDBC 2.0 (之前是 1.1)
这里是一篇解释如何从 Spring Data JDBC 1.1 迁移到 2.0 的文章链接。
Spring Data MongoDB 3.0 (之前是 2.2)
Spring Data for Apache Cassandra 3.0 (之前是 2.2)
Spring Data Couchbase 4.0 (之前是 3.2)
Spring Data Elasticsearch 4.0 (之前是 3.2)
了解 Spring Data Elasticsearch 的新特性。
在继续讨论精选新特性之前,让我们先分解一些 API 变更。如有疑问,请查阅模块参考文档中的“升级”部分。而且,对于那些担心现在升级会过于痛苦的人来说,之前的 Moore 发布系列仍然会存在,并会在接下来的十二个月内接收更新。
JDBC 每个 SQL 存储都有其独特的特性,需要特定的处理。为了更好地支持这一点,我们进行了一些更改,导致该模块进行了主要版本升级。现在,默认情况下,AbstractJdbcConfiguration
会尝试从提供的 DataSource
或注册的 DialectResolver
中确定数据库特定的 Dialect
。开箱即用,JDBC 模块提供了针对 H2、HSQLDB、MySQL、Postgres、MariaDB、Microsoft SqlServer 和 DB2 的方言。Spring Data JDBC 现在默认也会引用所有表名和列名。虽然这可能迫使您调整您的 CREATE TABLE
语句或 @Column
注解,但在选择这些名称时提供了更大的灵活性。
MongoDB Spring Data MongoDB 集成了 MongoDB Java 和响应式流 4.0 驱动程序代,允许您选择所需的方法,而无需将另一个驱动程序添加到路径中。因此,同步和响应式 MongoDB 驱动程序现在都是可选依赖项,需要手动添加。随着新驱动程序的推出,一些已被弃用的 API 最终被移除,影响了暴露的配置类,如 AbstractMongoConfiguration
以及 Spring Data 实现提供的 XML namespace 元素。我们在参考文档的升级部分总结了面向公众的变更。
Apache Cassandra 期待已久的 Apache Cassandra 4.0 驱动程序代升级,不仅带来了新的包和数据结构,还改变了集群和会话处理的行为,导致配置发生了广泛的变更,在使用 XML namespace 或比仅使用 AbstractCassandraConfiguration
的默认设置更复杂的场景时,这些变更会渗透到用户配置中。
Couchbase Couchbase 模块遵循 Couchbase SDK 并从 3.x 版本升级到 4.x 版本,其中包括自动索引管理和事务支持。请在其博客中阅读完整故事。
Elasticsearch 该版本增加了对 HTTP Client API、SSL 和 Proxy 的支持,同时进行了广泛的内部变更,包括精简和移除(已弃用)的 API,因此需要进行主要版本升级。Elasticsearch 模块现在提供了一个涵盖 Get-
、Index-
和 Search-Requests
的 Document
,允许映射层使用 SearchHit
、SearchHits
和 SearchPage
等类型。
准备就绪,让我们继续介绍精选的新特性。
Neumann 版本完善了始于 Moore 的故事,通过为支持的存储库模块添加专门的 Coroutines 仓库支持,引入了对 Kotlin Coroutines 的一流支持。
Coroutines 支持由 Spring Data 的响应式仓库支持提供。因此,既可以调用响应式查询方法,也可以使用原生的挂起函数。
interface StudentRepository : CoroutineCrudRepository<Student, String> {
suspend fun findOne(id: String): User
fun findByLastname(firstname: String): Flow<Student>
}
@Primary
仓库和 search
关键字这两项看似微小的改进缓解了仓库 bean 查找和 finder 方法命名中的一些痛点。我们将 @Primary
注解从扫描到的仓库 bean 定义提升到为仓库工厂创建的定义上,这有助于容器在某些场景下理清仓库的装配。此外,search
前缀可以用作熟悉的 find
关键字的别名,现在支持诸如 searchByFirstname
等查询的 search…By…
模式。
虽然设计初衷是为了针对 Elasticsearch 等存储,但让我们继续,在 Spring Data R2DBC 刚发布的查询派生支持中使用新的 search…By…
模式。
到目前为止,除了通过 *.Repository
接口提供的默认功能外,Spring Data R2DBC 在使用时大量依赖于仓库 finder 方法上的 @Query
注解。Neumann 版本通过添加方法名查询派生功能,缩小了与许多其他模块实现的差距,如下面的代码片段所示
interface StudentRepository extends ReactiveCrudRepository<Student, Long> {
Flux<Student> searchByLastname(String lastname); (1)
}
@Query("select id, firstname, lastname from customer c where c.lastname = :lastname")
让我们继续讨论关系型存储,Spring Data JDBC 2.0 支持更广泛的数据库。我们现在使用 H2、HSQLDB、MySQL、MariaDB、PostgreSQL 和 DB2 进行集成测试。
对于这些数据库,我们支持查询派生和分页。使得如下所示的仓库成为可能
interface StudentRepository extends PagingAndSortingRepository<Student, Long> {
Page<Student> findByLastname(String lastname);
}
接下来我们将转向 NoSQL 存储领域,首先介绍 MongoDB 及其修改文档的新方法。
一项重要的增强功能(未能完全赶上 Moore 版本发布,现在得益于缩短的发布周期)允许您使用 聚合管道 (Aggregation Pipeline) 进行更新操作。通过这样做,更新可以包含更复杂的语句,例如基于实际字段值的条件,如下所示
AggregationUpdate update = Aggregation.newUpdate()
.set("average").toValue(ArithmeticOperators.valueOf("tests").avg())
.set("grade").toValue(ConditionalOperators.switchCases(
when(valueOf("average").greaterThanEqualToValue(90)).then("A"),
when(valueOf("average").greaterThanEqualToValue(80)).then("B"),
when(valueOf("average").greaterThanEqualToValue(70)).then("C"),
when(valueOf("average").greaterThanEqualToValue(60)).then("D"))
.defaultTo("F")
);
template.update(Student.class)
.apply(update)
.all();
考虑到下一个版本,Spring Data MongoDB 肯定会受益于最近已添加到其他模块的一项功能:支持嵌入式对象。
Apache Cassandra 作为一种以表为中心、将数据保存在列中的数据存储,现在支持嵌入式类型映射,这项功能已在 Spring Data JDBC 中提供。嵌入式实体用于在 Java 领域模型中设计值对象,其属性会被平铺到表中。在以下示例中,Student.name
用 @Embedded
注解,这会使 Name
的所有属性被折叠到 student 表中,该表包含三列(student_id
、firstname
和 lastname
)。
public class Student {
@PrimaryKey("student_id")
private String studentId;
@Embedded(onEmpty = USE_NULL)
Name name;
}
public class Name {
private String firstname;
private String lastname;
}
由于 id
的存在不足以判断 Elasticsearch 中的实体是否为新实体,因此在实现 `Persistable 时,需要通过 isNew()
方法提供额外信息,如下所示
@Document(indexName = "person")
public class Person implements Persistable<Long> {
@Id private Long id;
private String lastName;
private String firstName;
@Field(type = Date)
private Instant createdDate;
private String createdBy
@Field(type = Date)
private Instant lastModifiedDate;
private String lastModifiedBy;
@Override
public boolean isNew() {
return id == null || (createdDate == null && createdBy == null);
}
}
完成上述设置后,在配置中添加 @EnableElasticsearchAuditing
即可注册使其正常运行所需的所有组件。
Spring Data Neo4j 通过替换之前已弃用且现已移除的 placeholder 样式,引入了对 Neo4j 4.0 参数语法的支持。它现在依赖最新的 Neo4j-OGM 和 Neo4j Java driver,以便在使用最新版本的 Neo4j 时获得最佳体验。
虽然不直接属于当前的发布系列(但已准备好被下一个系列采纳),Neo4j 一直在努力推进其图形数据库的响应式支持,并与 Neo4j RX 整合 Spring Data。
Spring Data for Apache Geode and VMware Tanzu GemFire,统称为 SDG,现在将 spring-data-geode
和 spring-data-gemfire
两个模块合并到一个项目中。Apache Geode 已升级到 1.12.0
版本,GemFire 已升级到 9.10.0
版本,后者本身基于 Apache Geode 1.12
。此外,SDG 可以在 JDK 8
到 JDK 14
上构建和运行。
SDG 现在支持自动事务事件发布,它将 GemFire/Geode Cache TransactionEvent 转换为在上下文中触发的相应 ApplicationEvent。
现在还可以在配置了 SDG 的 AEQ 上暂停事件分发。此外,在使用 SDG 的 @LocatorApplication
注解构建基于 GemFire/Geode Locator 的应用程序时,您现在可以配置 Locator 连接到其他 Locator,从而形成高可用、高弹性的集群。