我们很高兴宣布发布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一起工作并适用于新类型系统
工件
所有Hibernate ORM工件都已移动到新的groupdId - 从org.hibernate
到org.hibernate.orm
。为每个发布的模块发布了重新定位的工件
hibernate-envers
已并入到hibernate-core
模块,以提供更好的集成 - 对用户来说更容易且更强大。
hibernate-spatial
、hibernate-ehcache
、hibernate-infinispan
和hibernate-jcache
已被临时禁用。事实上,有人讨论完全删除其中的两个
-
hibernate-ehcache
- 此模块支持使用Ehcache 2,据Ehcache开发者所说,“不再受支持”。但几周前刚发布了新版本。:)无论如何,使用Ehcache作为二级缓存的首选方式是通过hibernate-jcache
+ Ehcache 3。 -
hibernate-infinispan
- 使用Infinispan作为Hibernate二级缓存集成的工作已转移到Infinispan开发者那里。此模块已发布5.3以来的重新定位版本