写在前面:这是 Beta,不是 GA

Hibernate ORM 8.0 目前仍处于 Beta 阶段。据 InfoQ《Java News Roundup》(2026-09-28 刊,覆盖约 2026-09-21 当周)报道,团队相继发布了 8.0.0.Beta2 与跟进的 8.0.0.Beta3,重点推进 Jakarta Persistence 4.0(含 M4 相关能力)——例如用 @PostCreate / @PreClose 观察 EntityManager / EntityAgent 生命周期,以及为 StatelessSession 与 EntityAgent 补齐版本锁相关并发能力。下文技术细节以官方 What’s New in 8.0 为准;文中配置与 API 本文未做本地验证,请以文档与发行说明为准。

对熟悉 JPA / Hibernate 的读者而言,8.0 的两条主线很清晰:一是把无状态会话正式抬到 JPA 4 的 EntityAgent,并默认换成图(graph)驱动的 flush;二是为「把 SessionFactory 交给 LLM / Agent 生成查询」这类场景提供可开关的 Safe Mode 门禁。Spring Boot / Spring Data JPA 用户可把前者看作高吞吐写路径的升级信号,把后者看作 Agent 生成 HQL 时必须打开的护栏——下文只点到为止,不展开成 Spring 专稿。

EntityAgent:把 StatelessSession 标准化进 JPA 4

Jakarta Persistence 4.0 是 Hibernate 8.0 的核心背景。官方 What’s New 明确写出:EntityAgent终于标准化了 Hibernate 长期以来的 StatelessSession。换句话说,无状态、按批处理、弱会话一级缓存的那套编程模型,不再只是 Hibernate 扩展接口上的「熟面孔」,而是进入规范层面的一等公民。

与之配套的还有一组 JPA 4 能力(节选,完整列表见官方文档):

  • 面向 EntityManager / EntityAgent / TypedQuery / Statement 等的 类型安全 Option(含 CreationOption);
  • 程序化 SQL 结果集映射、Criteria 从 HQL 创建、更清晰的 Statement 与查询边界;
  • @EntityListener 及相关生命周期监听改进;
  • @Fetch / FetchOption、集合默认抓取模式等。

锁模式:无状态会话终于「能锁」

StatelessSession 与 EntityAgent 现已支持实体加载与查询(含流式结果)上的全部 LockModeType。官方特别说明:乐观锁模式会立即获得保护,而不是把版本检查拖到提交;OPTIMISTIC_FORCE_INCREMENT 与 PESSIMISTIC_FORCE_INCREMENT 都会立即递增版本。数据库侧要求请参阅 Migration Guide(本文未本地验证各库行为)。

这对批量导入、ETL、高吞吐写路径很有意义:过去无状态会话缺少完整锁语义,并发控制往往要绕开或降级;现在可以在仍走 EntityAgent / StatelessSession 的前提下表达锁意图。

@PostCreate / @PreClose:持久化单元生命周期回调

新的 @PostCreate 与 @PreClose 用于观察 EntityManagerFactory、EntityManager 或 EntityAgent 的创建与关闭。写法是:在标注了 @EntityListener 的类上声明回调方法,并注册到持久化单元;方法返回 void,接受对应工厂、管理器或 Agent 类型的单一参数。InfoQ 对 Beta2/Beta3 的摘要也点到了这两类注解,与官方文档一致。

此外,@EntityListeners 还可声明在 package-info.java 或 module-info.java,把监听器挂到包/模块级实体,而不必在每个实体上重复声明。模块级监听器先于包级,再是实体层次上声明的监听器;@ExcludeDefaultListeners不会抑制包/模块级监听器。

Session / Query Options:类型安全的厂商扩展点

JPA 4 允许通过标准 API 直接传入类型安全的厂商 Option。Hibernate 侧大致分三层(名称均以官方文档为准):

  • 创建期(EntityManager.CreationOption / EntityAgent.CreationOption):如 TenantId、EffectiveAt、EnabledFilter、FetchBatchSize、JdbcBatchSize、Interceptor、StatementObserver 等;
  • 会话期可变(EntityManager.Option / EntityAgent.Option):如 CacheMode、FlushMode、BatchSize、ReadOnlyMode、EnabledFetchProfile 等;
  • 查询/语句(TypedQuery.Option / Statement.Option):如 JdbcFetchSize、Comment、锁模式、缓存相关选项等。

文档示例(创建只读、带租户与「有效时间点」的会话)示意如下:

var entityManager = entityManagerFactory.createEntityManager(
    new TenantId("acme"),
    new EffectiveAt(now().minus(1, YEARS)),
    ReadOnlyMode.READ_ONLY
);

这对 Spring Data JPA 读者的实用含义是:日后若 Boot / Data 跟进 JPA 4 Option 暴露方式,配置「租户、只读、批大小」有望从散落的 Hibernate 专有 API 收敛到更标准的创建参数;在 8.0 Beta 阶段,仍应以 Hibernate 官方 API 与迁移指南为准,勿假定当前 Spring Boot 发版已完整封装。

默认 graph-based flush,以及 Jakarta Data 1.1

图驱动 flush:默认开启,可回退 legacy

8.0 引入基于关系约束图的 flush 协调:在每次 flush 时,依据领域模型映射的外键、唯一约束、可选表、二级表等构建依赖图,再规划 insert / update / delete 与集合写操作顺序。目标是减少「启发式排序」带来的特例失败,让批处理更可预期,并为后续 flush 期优化打基础——尤其适合对象图深、实体与集合变更混杂、约束顺序敏感的 schema。

该策略默认启用。 若需临时回到旧策略,可配置:

hibernate.flush.queue.type=legacy

org.hibernate.cfg.FlushSettings 还提供若干控制图驱动 flush 的新设置(细节见官方文档,本文未逐项验证)。升级评估时建议:先在预发对比 flush 顺序与批写入行为;若出现与旧版不一致的约束冲突或性能回退,再用 legacy 做对照,而不是长期关掉新路径。

Jakarta Data 1.1

Hibernate Data Repositories 实现 Jakarta Data 1.1,包括:与 JPA 4 静态查询(含 @QueryOptions)的集成、restrictions / constraints、@Select 投影、有状态仓储,以及基于 Jakarta Concurrency 或 Hibernate Reactive 的异步仓储。若你已在用或计划用 Jakarta Data 仓储风格,这是与 8.0 / JPA 4 同船升级的另一条线。

Safe Mode:把 SessionFactory 交给 LLM 时的查询门禁

8.0 提供可选的 HQL / Criteria Safe Mode,用来限制潜在不安全的查询操作。官方明确指出:该能力对「通过各种集成把 Hibernate SessionFactory 暴露给大型语言模型(LLM)」的应用、以及安全意识强的组织与多租户场景尤其有价值。

启用方式(默认关闭):

hibernate.query.safe_mode_enabled=true

开启后会拦截以下操作:

  • sql():阻止运行时拼任意 SQL 片段;
  • function():阻止显式任意函数调用;
  • column():阻止任意表列访问;
  • 未注册函数:Dialect 上未显式注册的函数调用会被拒绝。

若要在 Safe Mode 下使用自定义函数,须通过 org.hibernate.boot.model.FunctionContributor显式注册。违规时 Hibernate 会抛出异常,并指明不被允许的函数或操作。

能力边界:门禁,不是「绝对安全」

务必写清边界,避免夸大:

  1. Safe Mode 管的是 查询语言层 的危险构造(任意 SQL/函数/列与未注册函数),不是完整的应用层授权、行级权限或提示词注入防护。
  2. 合法但可枚举敏感数据的 HQL(例如宽 select、宽松 where)仍可能执行——需要结合仓储白名单、参数化、租户过滤、审计与限流。
  3. 它是 opt-in;忘记开启等于没有这道门。
  4. Beta 阶段行为与异常文案可能仍会调整,生产采纳前请对照最终 GA 文档与 Migration Guide。

一句话:Safe Mode 是「SessionFactory 暴露给 Agent 时的查询防火墙」,应作为纵深防御的一环,而不是唯一防线。

Spring Boot / Spring Data JPA 读者怎么看(点到为止)

高吞吐写路径。 若你今天已在用 StatelessSession 做批量写入,或计划用 JPA 4 的 EntityAgent 走无状态批处理,8.0 的锁模式补齐、图驱动 flush、以及更清晰的 Session Options,都是值得跟进的信号。评估时重点看:flush 顺序变化是否触碰约束、批大小与 JDBC 批设置是否仍匹配、乐观/悲观强制递增在目标库上的行为(见 Migration Guide)。

Agent 生成 HQL。 若产品侧会把查询能力交给 LLM(自然语言 → HQL/Criteria),请把 hibernate.query.safe_mode_enabled=true 当作默认门禁,再叠加:只暴露受控仓储方法、禁止直接下发 sql()/function()/column()、自定义函数一律 FunctionContributor 注册、并对生成查询做审计。Spring Data JPA 的派生查询与 @Query 白名单,与 Safe Mode 是互补关系,不是替代关系。

当前 Spring Boot / Spring Data 对 Hibernate 8 / JPA 4 的封装进度需以各自发版说明为准;本文未验证某具体 Boot 版本已默认拉起 8.0 Beta。

小结与建议

  • Hibernate ORM 8.0 仍为 Beta(InfoQ 提及 Beta2/Beta3,约 2026-09-25 前后窗口);不要按 GA 做生产硬切。
  • EntityAgent 标准化 StatelessSession;补齐锁模式;@PostCreate / @PreClose 与包/模块级监听器完善生命周期钩子;JPA 4 Options 提供类型安全扩展点。
  • 默认 graph-based flush,可用 hibernate.flush.queue.type=legacy 回退;Jakarta Data 1.1 同步落地。
  • Safe Mode(hibernate.query.safe_mode_enabled=true)拦截 sql() / function() / column() 与未注册函数——面向 LLM/Agent 暴露 SessionFactory 时的关键门禁,但不是绝对安全保证。

升级建议:在隔离环境验证 Beta3(或更新 Beta)、对照 What’s New 与 Migration Guide 做行为对比,再决定是否跟进后续 RC/GA。

参考链接

— 感谢阅读 —

一起交流

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