我们很高兴宣布发布6.0 Alpha1版本。

6.0版本的主要设计目标是进一步提升Hibernate的吞吐性能。高负载性能测试表明,Hibernate通过从ResultSet按名称读取值的方式是其扩展吞吐量的最大限制因素。从最基本的层面来看,6.0主要是从旧的按名称读取策略转变为按位置读取。但这个简单目标有许多后续影响。

我们已经取得了很大的进展,但仍然是一个Alpha版本,所以还有很多工作要做。以下每个部分都分解了哪些功能是可行的,哪些不可行,哪些尚未实现。

类型系统

从按名称读取到按位置读取的改变显然会影响Hibernate对ResultSet的实际调用。这反过来又影响了Hibernate的“类型系统”定义,以便能够调用ResultSet的按位置重载。

如果您编写或使用自定义Hibernate类型,这套更改将不会与之前版本保持源代码和二进制兼容性。遗憾的是,这是显示这一差异的合约之一,传递String与传递int。

Alpha1包含处理各种“基本值”自定义的初始提案,包括BasicType、UserType、@SqlType、@SqlTypeDescriptor、@SqlTypeRegistration、@JavaTypeDescriptor、@JavaTypeRegistration。

托管类型和集合的描述符也发生了显著变化。请参阅RuntimeModelDescriptorFactory和RuntimeModelDescriptorClassResolver。

到目前为止,该领域的发展主要集中于支持

基本值

完全实现

可嵌入值

完全实现

一对一

支持(请参阅关于“非聚合组合标识符”的说明)

多对一

完全实现

一对多

已实现,但

  • 向现有集合添加值

  • 从现有集合中删除值

  • 使用连接表的多向非双向映射可以工作,不使用连接表则不行

多对多

部分实现

任何

尚未实现

多对任何

尚未实现

已知限制

  • 对于大多数情况,延迟加载集合尚未实现

  • 尚未支持“非聚合复合标识符”(@IdClass

  • 尚未实现插入后标识符生成(IDENTITY等)

  • 尚未实现继承(对基于辨别器的有限支持)

  • 尚未实现对@SQLInsert@SQLDelete等的支持

请参阅https://github.com/hibernate/hibernate-orm/blob/6.0.0.Alpha1/design/type-customization.adoc。这是一份正在进行的文档,描述了如何自定义Hibernate的类型系统以及Hibernate如何将值映射到数据库。该文档最终将成为用户指南的一部分。

生成的SQL

我们预计主要性能提升将来自实际的JDBC ResultSet调用。然而,当我们生成SQL时,有许多次要的好处。

由于我们不再需要结果别名来读取结果,因此我们不需要在SQL中生成它们。

并且鉴于6.0中的其他更改,我们能够更好地洞察如何以其他方式进一步精简生成的SQL,例如避免之前需要渲染的连接。

此外,这些生成的SQL更改使得我们发送到数据库的内容更加简洁,这提高了网络和数据库解析器/分析器的性能。而且,它读起来更简单——额外的好处!

HQL

Hibernate现在使用Antlr v4来解释HQL查询。Antlr v4比Hibernate一直使用的Antlr v2(包括5.x及之前版本)快得多。

我们还清理和重构了语法以提高性能。

计划为6.0添加许多新的HQL语言特性。Alpha1包括以下内容

  • 嵌套动态实例化 - 将动态实例化用作另一个动态实例化的参数。例如,select new DTO( a.id, new AnotherDTO( a.name, …​. ), …​ ) …​

  • 多个动态实例化 - 自由混合动态实例化与其他结果类型。例如,select a.id, new DTO( a.key, a.text ), new AnotherDTO( a.name, …​. ), …​

  • 使用类似JDBC转义语法的扩展文字类型支持。例如,…​ where e.startTime < {ts '1999-01-01 00:00:00.0'}

  • 更好地支持自定义查询函数。更好,但不同——自定义函数的提供者需要更新到新的签名,这些签名旨在与AST一起工作并适用于新类型系统

非HQL查询

截至6.0,Hibernate的旧版org.hibernate.Criteria支持已被移除。对JPA Criteria的支持尚未实现。

对原生查询的支持也尚未实现

工件

所有Hibernate ORM工件都已移动到新的groupdId - 从org.hibernateorg.hibernate.orm。为每个发布的模块发布了重新定位的工件

hibernate-envers已并入到hibernate-core模块,以提供更好的集成 - 对用户来说更容易且更强大。

hibernate-spatialhibernate-ehcachehibernate-infinispanhibernate-jcache已被临时禁用。事实上,有人讨论完全删除其中的两个

  • hibernate-ehcache - 此模块支持使用Ehcache 2,据Ehcache开发者所说,“不再受支持”。但几周前刚发布了新版本。:)无论如何,使用Ehcache作为二级缓存的首选方式是通过hibernate-jcache + Ehcache 3。

  • hibernate-infinispan - 使用Infinispan作为Hibernate二级缓存集成的工作已转移到Infinispan开发者那里。此模块已发布5.3以来的重新定位版本

下一步

Alpha2的计划包括实现以下内容

  • 实现继承支持

  • 完成关联映射实现

  • 实现Criteria支持

更多信息

请参阅用户指南迁移指南

还可以查看发布页面

要取得联系,请使用常规渠道


返回顶部