Spring Data (Klara Dan von Neumann) 的新特性

工程 | Christoph Strobl | 2020年5月18日 | ...

Spring Data Neumann 是第一个遵循新的六个月发布周期的版本。缩短的时间框架使我们能够更频繁地交付新功能,这对于帮助您更快地迭代至关重要。此版本本身包含大量新内容,并包括对多个存储库的重要(可能破坏性的)升级。

主要版本升级

如下列出的几个存储模块由于其公开的 API 或驱动程序中可能存在的破坏性更改而需要进行主要版本升级。

在继续介绍选定的新功能之前,让我们先分解一些 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 命名空间元素。我们在参考文档的升级部分中总结了面向公众的更改。

Apache Cassandra 对 Apache Cassandra 4.0 驱动程序生成的期待已久的升级,不仅包括其新的包和数据结构,还包括集群和会话处理中的行为更改,导致配置发生广泛更改,这在使用 XML 命名空间或比使用 AbstractCassandraConfiguration 的默认设置更复杂的情况下会影响用户配置。

Couchbase Couchbase 模块遵循 Couchbase SDK 并从 3.x 版升级到 4.x 版,其中包括自动索引管理和事务支持。请阅读其博客中的完整故事。

Elasticsearch 此版本增加了对 HTTP 客户端 API、SSL 和代理的支持,以及包括简化和删除(已弃用)API 的广泛内部更改,这需要进行主要版本升级。Elasticsearch 模块现在提供一个 Document,涵盖 Get-Index-Search-Requests,允许映射层使用 SearchHitSearchHitsSearchPage 等类型。

准备好舞台后,让我们继续介绍一些新功能。

Kotlin 协程存储库

Neumann 版本完成了从Moore开始的故事,通过添加对支持存储模块的专用协程存储库的支持,引入了对Kotlin 协程的一流支持。

协程支持由 Spring Data 的响应式存储库支持提供支持。因此,可以调用响应式查询方法或使用本机挂起函数。

interface StudentRepository : CoroutineCrudRepository<Student, String> {

    suspend fun findOne(id: String): User

    fun findByLastname(firstname: String): Flow<Student>
}

@Primary 存储库和 search 关键字

这两个相当小的改进减轻了存储库 bean 查找和查找器方法命名的痛苦,因为我们现在将 @Primary 注解从扫描的存储库 bean 定义提升到为存储库工厂创建的注解,这有助于容器在某些情况下解开存储库连接。附加的 search 前缀可以用作众所周知的 find 关键字的别名,它现在接受 search…By… 模式用于诸如 searchByFirstname 之类的查询。

虽然旨在针对 Elasticsearch 等存储,但让我们继续并将新的 search…By… 模式与 Spring Data R2DBC 最新推出的查询派生支持一起使用。

R2DBC 查询派生

到目前为止,Spring Data R2DBC 在使用方面大量使用了存储库查找器方法上的 @Query 注解,除了通过 *.Repository 接口提供的默认值之外。Neumann 版本现在通过添加方法名称查询派生来弥合与许多其他模块实现之间的差距,如下面的代码片段所示。

interface StudentRepository extends ReactiveCrudRepository<Student, Long> {

	Flux<Student> searchByLastname(String lastname); (1)
}
  1. 相当于 @Query("select id, firstname, lastname from customer c where c.lastname = :lastname")

JDBC 的分页和查询派生支持

再关注一下关系型数据库,Spring Data JDBC 2.0 支持更广泛的数据库。我们现在使用 H2、HSQLDB、MySQL、MariaDB、PostgreSQL 和 DB2 运行集成测试。

对于这些数据库,我们支持查询派生和分页。使以下之类的存储库成为可能。

interface StudentRepository extends PagingAndSortingRepository<Student, Long> {

	Page<Student> findByLastname(String lastname);
}

接下来我们转向 NoSQL 数据库,从 MongoDB 及其修改文档的新方法开始。

MongoDB 更新聚合

一项重要的增强功能(这并没有完全进入 Moore 版本,现在受益于缩短的发布周期)允许您对更新操作使用聚合管道。这样做,更新可以包含更复杂的语句,例如基于实际字段值的条件,如下所示。

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嵌入类型支持

Apache Cassandra 作为一种以表为中心的数据库,其数据存储在列中,现在支持嵌入类型映射,此功能已在Spring Data JDBC中提供。嵌入实体用于在 Java 领域模型中设计值对象,其属性会展平到表中。在下面的示例中,Student.name 使用 @Embedded 注解,这会触发将 Name 的所有属性折叠到学生表中,该表包含三列(student_idfirstnamelastname

public class Student {

    @PrimaryKey("student_id")
    private String studentId;

    @Embedded(onEmpty = USE_NULL)
    Name name;
}

public class Name {
    private String firstname;
    private String lastname;
}

使用 Elasticsearch 进行审计

由于 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 将注册所有使其运行所需的组件。

Neo4j

Spring Data Neo4j 通过替换先前已弃用且现已删除的占位符样式,为 Neo4j 4.0 参数语法提供支持。它现在依赖于最新的 Neo4j-OGM 和 Neo4j Java 驱动程序,以便在使用最新版本的 Neo4j 时获得最佳体验。

虽然不是当前发布列车的一部分(尽管它已准备好被下一个发布列车接管),但 Neo4j 一直在努力推动图数据库及其与 Neo4j RX 的 Spring Data 集成的反应式支持。

Apache Geode / VMware Tanzu GemFire

用于 Apache Geode 和 VMware Tanzu GemFire 的 Spring Data(统称为 SDG)现在将 spring-data-geodespring-data-gemfire 模块合并到单个项目中。Apache Geode 已升级到 1.12.0,GemFire 已升级到 9.10.0,后者本身基于 Apache Geode 1.12。此外,SDG 在 JDK 8JDK 14 上构建和运行。

SDG 现在支持自动事务事件发布,它将 GemFire/Geode 缓存 TransactionEvent 转换为在上下文中触发的相应 ApplicationEvent。

现在还可以暂停使用 SDG 配置的 AEQ 上的事件调度。此外,在使用 SDG 的 @LocatorApplication 注解构建基于 GemFire/Geode Locator 的应用程序时,您现在可以配置 Locator 以连接到其他 Locator,从而形成一个高可用性、高弹性的集群。

订阅 Spring Newsletter

关注 Spring Newsletter

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部