Spring Data 2020.0 - Spring Data Neo4j 6.0 新特性与值得关注之处

工程 | Christoph Strobl | 2020年11月20日 | ...

Spring Data Neo4j 是一个由 Neo4j, Inc. 维护和开发的 Spring Data 社区项目。代表 Neo4j 团队中负责该模块的成员,我们很高兴分享他们对 2020.0.0 版本 中最新更改和新功能的见解。

使用 Spring Boot 2.3 的 Neo4j 用户需要注意,因为 Spring Data Neo4j 6.0 的配置基础设施发生了不兼容的更改。

也就是说,不仅配置基础设施发生了变化,整个项目都发生了变化。

该模块有一些历史,经历了多次重大更改。大约四年来,它遵循 Spring Data JPA 原则:使用 Spring Data 作为薄层来协调底层对象映射器。

对于 Neo4j,该映射器称为 Neo4j-OGM。虽然 Neo4j-OGM 非常灵活,但它也有一定的代价。它不仅像任何对象映射器一样对我们的查询语言进行抽象,而且还对传输进行抽象。它可以用来启动嵌入式 Neo4j,使用 HTTP 或我们自己的 Bolt 协议。最后但并非最不重要的是,它在客户端重新创建图的许多抽象。也就是说,它在映射过程中创建本地图模型,并通过迭代该模型来构建对象,而不是以面向记录的方式工作。

有了这么多的抽象,各种事情变得越来越困难

  • 以一种不仅仅是在顶部添加虚假响应式层的方式支持响应式编程范例

  • 支持不可变对象

  • 提供可组合的堆栈

  • 方便使用 Cypher 和自定义查询 - 无论是否进行映射

新的 Spring Data Neo4j 6.0 主要版本解决了所有这些问题。

我们在大约 2019 年 3 月左右开始了这项工作,受到了 Spring Data 团队围绕 Spring Data JDBC 的出色工作的启发。SDN 6 最初是一个名为 SDN/RX 的副项目。通过 SDN/RX,我们收集了客户和早期采用者的反馈,其中包括 JHipster 用户。

最终,它成为 SDN 6,我们在 Spring One 2020 上宣布了它

幻灯片:https://speakerdeck.com/michaelsimons/spring-up-your-graph

这对您有什么好处

  • 完全支持响应式编程,从映射层到数据库(需要 Neo4j)。

  • 与各种 Neo4j Java 驱动程序版本兼容:从 4.0 到 4.2 和未来的版本,从而支持 Neo4j 3.5 到 4.2(尚未发布)。

  • 根据 Spring Framework 和 Spring Data 的基准,JDK 8,但它在 JDK 15 中也能很好地运行,包括使用 Records 预览作为域类。

  • 说到记录,映射是面向记录的,因此可以完全检索不可变的流水线和映射数据。这适用于 Kotlin 数据类、Java 15 记录,当然也适用于带有 withers 的“数据”类,无论是手动创建的还是通过 Lombok 创建的。

  • Spring Data Neo4j 首次支持基于findByExample 的方法。

  • 介绍我们新的 https://github.com/neo4j-contrib/cypher-dsl。我们在内部使用它,但您也可以用它创建自定义查询。

  • 支持实验性的 Spring Native 项目,Spring Data Neo4j。Cypher-DSL 和 Neo4j Java 驱动程序与 GraalVM 的原生镜像完全兼容。

  • Neo4j 模板的回归。

  • 定义明确的多层次抽象

    • SDN 6 不再负责创建数据库连接。它也不负责启动嵌入式实例。相反,您需要提供驱动程序(或让 Spring Boot 为您处理此问题)。

    • 随意使用驱动程序。根据需要管理您的事务。

    • SDN 6 为您提供驱动程序上的一个轻量级客户端。我们希望该客户端有一些不错的可用挂钩,用于您自己的映射。至少我们对此很满意,并在幕后使用它。该客户端与 Spring 的事务管理器集成。

    • 客户端之上是 Neo4j 模板。它了解您的域模型。

    • 模板由存储库抽象使用。

对我们来说非常重要的一点是:对 Neo4j 的支持是嵌入式的。虽然 Neo4j-OGM 不仅可以启动嵌入式实例,还可以直接使用 Graphdatabase API,但我们根本不推荐这种方法。从对象映射层启动任何数据库都会带来很多问题。这从数据库带入应用程序的大量依赖项开始,继续到多个相同服务的实例的同步,并可能最终导致关闭时间问题,尤其是在 Kubernetes 上运行某些内容时,Kubernetes 倾向于快速终止进程。

如果您了解这些缺点,您仍然可以启动嵌入式 Neo4j。此处 是一个可以转换为 Spring bean 的示例。

然后,SDN 6 可以使用此嵌入式实例。您可以打开到它的本地 Bolt 连接。

Spring Boot 的基础设施有以下更改

  • 在顶级有一些新属性:spring.neo4j.* 现在用于配置数据库连接。

  • spring.data.neo4j.* 有一些新属性用于配置正在使用的数据库名称。

  • 更好的运行状况和(希望很快)出色的 Micrometer 指标支持。

  • @DataNeo4jTest 不再启动嵌入式实例。

关于最后一点,我们推荐 Testcontainers Neo4j 或手动创建和管理嵌入式实例。

您需要做什么?注释已更改,我们在 文档 中提供了一个专用页面来描述 OGM 的哪个注释已被 Spring Data Neo4j 注释替换。映射有点武断,您可能需要在几个地方重新修改您的域模型。

我们认为我们已经为未来几年的稳定框架奠定了基础,我们期待您的反馈。

我们要感谢 Spring Data 团队的团队负责人 Mark Paluch。Mark 对我们关于 Spring Data 公共组件内部工作原理的所有问题都表现出极大的耐心,并乐于倾听任何讨论。

此外,还要感谢来自 Project Reactor 的 Sergei Egorov:Sergei 不仅是 Java 生态系统中最友好的成员之一,而且还是所有响应式内容的热流。

当然,还要感谢 Stéphane Nicoll,他在过去两年中与我们一起改进 Spring Boot 中的 Neo4j 支持:通过挑战我们的想法,改进我们的代码,并最终实现现在更加简洁,并希望对我们共享的用户群更有吸引力的集成。

Michael Simons,代表 Spring Data Neo4j 团队。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部