Spring Data(Klara Dan von)Neumann的新功能

本文的翻译是在“ Spring框架开发人员”课程开始时准备的



您可以通过查看开放日记录来了解有关该课程的更多信息










Spring Data Neumann是自过渡到新的六个月发行周期以来的第一个发行版。减少发布之间的时间将使我们能够更频繁地发布新功能,这反过来也可以加快您的速度。在此版本中,除了新功能之外,还进行了重要的更改,有可能破坏与以前版本的兼容性。


更改主要版本



对于下面列出的项目,由于更改会破坏公共API或驱动程序的兼容性,因此增加了主要版本号:



  • Spring Data JDBC 2.0(以前的版本1.1)
  • 从1.1到2.0的迁移在这篇文章中进行了描述
  • Spring Data MongoDB 3.0(先前版本2.2)
  • Apache Cassandra 3.0(2.2以前的版本)的Spring数据
  • Spring Data Couchbase 4.0(以前的版本3.2)
  • Spring Data Elasticsearch 4.0(先前版本3.2)
  • 有关更改的详细信息,请参阅此文章


在继续描述新功能之前,让我们看一下API中的更改。有关详细信息,请参阅相应模块的文档中的“升级”部分。



如果您不准备立即更新,请记住,将在另外十二个月内支持以前的Moore版本。



JDBC



每个SQL存储都有其自身的特征,需要采取特殊的方法。为了改进他们的支持,进行了一些更改,这些更改影响了主要版本的增加。现在,AbstractJdbcConfiguration默认情况下,它将尝试Dialect从给定DataSource或已注册识别数据库DialectResolver默认情况下,JDBC模块随附了针对H2,HSQLDB,MySQL,Postgres,MariaDB,Microsoft SqlServer和DB2的方言。Spring Data JDBC现在默认情况下会转义所有表名和列名。尽管这可能会导致您更改自己的CREATE TABLE注解或注解@Column,但这将使您在命名对象时更具灵活性。



MongoDB



带有MongoDB驱动程序的单个jar(mongo-java-driver)分为几个:-sync和-reactivestreams,这使您可以仅选择所需的驱动程序。也就是说,同步和反应式MongoDB驱动程序现在都是可选的依赖项,必须手动添加。随着向新驱动程序的迁移,一些已经弃用的API被永久删除,从而影响了配置类,例如AbstractMongoConfigurationSpring Data提供XML名称空间。有关详细信息,请参见文档中升级部分



阿帕奇·卡桑德拉(Apache Cassandra)



早就应该将Apache Cassandra驱动程序更新为4.0,不仅更新了程序包和数据结构,而且还更改了群集和会话处理中的行为。这导致重大配置更改,从而影响XML配置,并可能影响某些复杂场景(比简单的默认设置难)的代码配置AbstractCassandraConfiguration



Couchbase



遵循Couchbase SDK,我们从版本3.x升级到版本4.x,其中添加了自动索引管理和事务支持。在Couchbase博客上阅读更多内容



弹性搜索



添加了对HTTP客户端API,SSL和代理的支持。还进行了许多更改,包括优化和删除了不赞成使用的API,这影响了主版本号的更改。该Elasticsearch模块现在包括文档,其中包括Get-Index-并且Search-Requests,它允许您使用类型,如SearchHitSearchHitsSearchPage



现在让我们继续创新。



支持Kotlin协程的存储库



Neumann版本继续建立在对Kotlin协程的支持之上,该支持始于先前的Moore版本,并在存储库中增加了对它们的支持。



协程通过响应式Spring Data存储库进行维护。现在,您可以使用反应式查询方法或编写自己的暂停函数。



interface StudentRepository : CoroutineCrudRepository<Student, String> {
    suspend fun findOne(id: String): User
    fun findByLastname(firstname: String): Flow<Student>
}


@Primary-存储库和“搜索”关键字



这两个小的更改改善了存储库Bean的检索和查询方法的命名。现在@Primary,在bean配置中考虑了接口存储库上的注释,这有助于容器解决依赖关系。现在,您可以"search"类似地将前缀用于查询方法"find"现在可以编写方法"search...By...",例如searchByFirstname



尽管这是针对像Elasticsearch这样的数据库完成的,但让我们继续前进,看看如何search...By...在Spring Data中使用R2DBC。



生成R2DBC查询



到目前为止,@Query除了通过interfaces公开的默认方法外,Spring Data R2DBC已将注释用于查询方法*.Repository现在,通过方法名称生成请求与其他模块类似:



interface StudentRepository extends ReactiveCrudRepository<Student, Long> {

	Flux<Student> searchByLastname(String lastname); (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);
}


在此版本中,我们还将继续从NogoDB开始,并以一种新的修改文档的方式向NoSQL迈进。



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中提供在域模型中,内置对象用于其属性存储在单个表中的值对象。在以下示例中,Student.name有一个注解字段以上@Embedded,这将导致类的所有字段Name被存储在表中Student由三个柱(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审核



由于在ElasticSearch中存在状态id不足以确定对象是否为新对象,因此有必要在实现期间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 RX集成到Spring Data中方面,也正在进行着积极的工作(尽管当前版本中不包括此功能,但已经准备好将其包含在下一个版本中)。



Apache Geode / VMware Tanzu GemFire



用于Apache Geode和VMware Tanzu GemFire(spring-data-geodespring-data-gemfire)的Spring Data模块组合为一个项目,标题为SDG。 Apache Geode已更新为1.12.0,GemFire已更新为9.10.0,后者又基于Apache Geode 1.12。此外,SDG可以在JDK版本8至14上编译并运行



.SDG现在支持发布自动事务事件,该事件将GemFire / Geode Cache中的Cache TransactionEvent映射到上下文中的相应ApplicationEvent。



现在也可以在配置了SDG的AEQ上暂停发送事件。此外,使用SDG注释构建基于GemFire / Geode Locator的应用程序时,@LocatorApplication您可以自定义定位器连接到其他定位器,从而创建一个高可用性和弹性集群。






了解有关该课程的更多信息。






阅读更多






All Articles