Spring 团队在 2026 年 9 月 23 日发布了 Spring Data 2026.1.0-M2(Mark Paluch)。这次里程碑最值得盯的两件事是:Spring Data JPA 给出对 JPA 4.0 / Hibernate ORM 8.0.0.Beta1 的初始兼容,同时仍以 JPA 3.2 为基线;以及 Redis 侧继续整理 JSON API(JsonOperations)。另外还有 JPQL 解析器冷启动分配优化、Relational 对 Unicode 库标识符的完整支持,以及 web payload 投影必须显式加 @ProjectedPayload 的破坏性收紧。

事实以 官博 与各模块 GitHub Release / changelog 为准。文中 API 示例取自官方 Javadoc 与既有迁移说明,未做本地联调。生产请继续跟稳定列车;M2 适合开验证分支。站内已有 Hibernate ORM 8.0 Beta 专稿,本文只补 Spring Data 侧对接,不展开 EntityAgent。

参与模块与版本

按官博列出的 2026.1.0-M2 组合(节选):

模块版本
Spring Data Commons4.2 M2
Spring Data JPA4.2 M2
Spring Data Redis4.2 M2
Spring Data Relational4.2 M2
Spring Data MongoDB5.2 M2
Spring Data REST5.2 M2

完整清单见官博(另有 Cassandra、Neo4j、KeyValue、LDAP、Elasticsearch、Couchbase 等)。若你同时在跟 Boot 4.2.0-M2 或 Cloud Paddington,请用各自 BOM 对齐模块号,避免在同一个构建里手工拼版本。里程碑构件是否已上 Maven Central,以你拉取时的仓库元数据为准;拿不到时再按 Spring 惯例补 https://repo.spring.io/milestone。

JPA:JPA 4.0 初兼容,基线仍是 3.2

官博原话是 Initial JPA 4.0 compatibility (using Hibernate 8.0.0.Beta1) while retaining the JPA 3.2 baseline。对应 Spring Data JPA 4.2.0-M2 changelog 里的 #4197。

含义要拆开看。

基线还是 JPA 3.2。 changelog 里默认依赖升级仍指向 Hibernate 7.4.x(M2 记到 7.4.9.Final),并不是把仓库默认切到 Hibernate 8。多数仍跑 3.2 / Hibernate 7 的项目,升到这一版 Data JPA 时,首先面对的是常规修补与解析器改动,而不是被迫换 Persistence 大版本。

同一 artifact 可探索 JPA 4.0 运行时。 JPA 4.0 对 Persistence API 有二进制不兼容处。议题里举例:早期叠 Hibernate 8 时,EntityManager.createNativeQuery(String, Class) 一类签名变化会直接变成 NoSuchMethodError。社区随后走「单制品、双运行时」路线(相关讨论见 #4307 一带),对签名分叉处做桥接,并把 AOT 生成路径也绕过同一桥。变化落在 Jakarta Persistence API 本身,因此换 EclipseLink 等实现时,同类签名问题仍可能出现,不能只当成 Hibernate 8 的特例。

Hibernate 8 仍是 Beta。 站内 Hibernate 专稿已写 EntityAgent、flush 默认策略等,这里不再复读。Spring Data 侧更实际的姿势是:想试 Persistence 4.0,先把 Spring Data JPA 升到 4.2.0-M2 这一带,再按官方兼容说明挂 Hibernate 8.0.0.Beta1;不要只升 ORM、不升 Data。生产若仍停在 JPA 3.2 / Hibernate 7,不必为了「初兼容」四个字强行上 Hibernate 8。

JPQL / HQL 解析器:冷启动分配下来了

同一次 JPA M2 还做了 HQL 解析器冷启动分配削减(changelog #4326、#4327),官博概括为 Performance refinements in Spring Data JPA JPQL parsers。

这类改动通常不改你的 @Query 字面量。更可能感受到差异的场景是:应用冷启动、首次解析大量字符串查询、或测试套件里反复起 Spring 上下文。顺带修了 JSqlParser 失败时的双重解析、括号化 set 运算上 Sort 只应作用最外层、HQL fetch 对 PERCENT 的支持,以及 EQL 里把 CAST 当作状态字段名等(见 JPA 4.2.0-M2 release notes)。升级验证时,优先回归「自定义 @Query + Sort / 分页」以及原生 SQL enhancer 路径即可。

Redis:JsonOperations 这条 JSON API

Redis JSON 能力在 4.2 线较早里程碑已引入;M2 的 changelog 写的是 Refactor Redis JSON API(#3433),官博称 Redis JSON API refinements。InfoQ 2026-09-29 roundup 用较长篇幅提到 JsonOperations 与序列化相关实现,可作对照,API 形态与行为以 JsonOperations Javadoc(4.2) 与 Redis 模块 changelog 为准。

入口是按 key 绑定的流式规格:value / array / string / bool。命令默认作用在文档根,除非再选 JSON path;路径语法跟 RedisJSON v2。规格对象不可变,拼好后再调用终端方法才会真正发命令。官方示例:

operations.value("user").set(new Person("John", "Doe"));
String firstName = operations.value("user").path("$.firstName").get().as(String.class);

多路径读取走 paths(key, ...):一次 JSON.GET 拉多个路径。路径可以是 "name"、"address.city" 这类属性路径,也可以是 "$.name" 这类 JSONPath,但同一请求里必须同一种形态;混用会按文档抛 IllegalArgumentException。返回侧可用 JsonResult / JsonPathResult 取原始 JSON 或反序列化成 Java 类型。多 key 读取用 values(...)(对应 JSON.MGET)。实现类常见是 RedisJsonTemplate,也实现 RedisJsonOperations。

试用前确认 Redis 端已启用 RedisJSON 模块;template 与序列化装配以当前 4.2 文档为准,M 版仍可能微调。InfoQ 提到的 GenericJackson2JsonRedisSerializer / GenericJacksonJsonRedisSerializer 与 RedisJsonSerializer、raw-value slicing 等细节,请回到 Redis 模块 changelog / Javadoc 核对后再写进自己的代码,本文不编造配置键。同一次 Redis M2 还有 Jedis Cluster 迁 UnifiedJedis、HSTRLEN、若干 TTL 溢出修复等,和 JSON 主线无关,按需翻 release notes。

Relational:Unicode 数据库标识符

Spring Data Relational 4.2.0-M2 完成 Fully support Unicode db identifiers(#2378)。表名、列名含非 ASCII(中文或其他 Unicode)时,映射与 SQL 生成应能完整走通。具体是否需要引号、大小写折叠、以及驱动侧编码,仍取决于数据库与 JDBC / R2DBC 驱动;升级后用真实标识符跑一遍 schema 映射与派生查询最稳妥。

同版本还修了 AOT 生成仓库在多属性静态 OrderBy、GreaterThanEqual 等处的源码问题,以及 @InsertOnlyProperty 在 @Embedded 上被 update / upsert 覆盖的问题。已经启用 AOT 的 JDBC 仓库,建议在 M2 上重新生成并编译一次,避免带着旧生成代码做对比。

破坏性:@ProjectedPayload 现在是硬门槛

官博写得很直:web handler method parameters must be annotated with @ProjectedPayload to enable projection proxying. Unannotated parameters are no longer proxied.

Commons 4.2.0-M2 changelog 对应 #3302:去掉「参数未标注 @ProjectedPayload」的警告日志。2026.0 列车里曾用警告过渡;到 2026.1 这条线,未标注参数不再做投影代理。注解类型是 org.springframework.data.web.ProjectedPayload,可标在接口类型或 handler 参数上(@Target({TYPE, PARAMETER}))。

示意(形态参考官方迁移说明):

@ProjectedPayload
interface OrderPatch {
  String getStatus();
}

@PatchMapping("/orders/{id}")
ResponseEntity<Void> patch(@PathVariable String id,
    @ProjectedPayload OrderPatch body) {
  // ...
}

第三方接口不能改源码时,把注解加在参数上即可。升级分支里全局搜 Controller 旁的投影接口参数:以前靠「长得像投影就被代理」的写法,现在会静默不再代理,表现可能是字段全 null 或绑定成别的解析路径。补注解,或改回具体 DTO / Record,比上线后再排障便宜。

和站内近期几篇的关系可以这样切:Hibernate ORM 8 Beta 专稿讲 ORM 能力本身;Boot 4.2.0-M2、Cloud Paddington 讲应用底板与网关 / 配置。本文只覆盖 Spring Data 2026.1.0-M2 列车里和数据访问直接相关的几处。若你已经在 Boot M2 验证分支上,可以把 Data BOM 一并带上,但回归用例仍建议按模块拆开看。

验证时怎么排

在验证分支引入 BOM 2026.1.0-M2(或你实际用到的模块 4.2.0-M2 / 5.2.0-M2),按模块切开测,比一次全升更清晰。JPA:先确认 3.2 基线回归(启动、常用仓库方法、带 Sort 的 @Query),再决定是否单开 Hibernate 8 Beta 试点。Redis:确认实例已加载 RedisJSON 后再试 JsonOperations 读写与 paths / values。Relational:准备含 Unicode 标识符的表做映射与派生查询,并重跑 AOT 生成。Commons / Web:扫一遍投影参数的 @ProjectedPayload,重点看 PATCH / 部分更新接口。尽量不要把 Data、Boot、Cloud 的破坏性改动叠进同一提交,出问题会很难归因。

参考

M2 仍是预览,RC / GA 前行为与默认依赖仍可能调整;落地前再对一遍正式发布说明。

— 感谢阅读 —

一起交流

分享你的思考,让讨论更进一步。