Hibernate ORM 6.0 的第一个 Beta 版本刚刚发布。
对于这个 Beta 版本,我们有一些主要目标
迁移到 Jakarta Persistence
Jakarta Persistence 正在替代 Java Persistence,随着 Java EE 向 Jakarta EE 过渡。有关详细信息,请参阅此博客。
对于用户来说,这意味着从 javax.persistence
命名空间迁移到 jakarta.persistence
。这会影响包/类名称以及设置/提示名称。有一些工具可以帮助进行此迁移。
至少在短期内,Hibernate 旨在同时支持这两套设置和提示名称。
类型系统
6.0 中的类型系统一直在演进,以适应新的按位置读取 JDBC 结果的方法。由于这些契约正在发生变化,并且这是一个主要版本,因此我们利用这个机会改进了类型系统,这将对用户产生影响。主要变化是删除了使用 BasicType
合约编写自定义类型的能力。所有自定义类型现在都基于 UserType
合约。
在未来的 6.0 Beta 版本中,我们还将弃用各种 BasicType
实现。依赖于这些特定类的应用程序应开始迁移到替代方案。
在这个 Beta 版本中,仅支持自定义基本类型。
新的自定义复合类型合约仍在讨论中。
新的自定义集合类型合约将基于 CollectionSemantics
合约,尽管如何最好地公开这一点仍在讨论中
计划在下一个 Beta 版本中添加对自定义复合类型和自定义集合类型的支持。
类型注解
有新的注解用于应用这些新合约。总的来说,所有基于 String 的类型规范注解都已删除。这是 Hibernate 首次添加注解支持时的一个糟糕选择 - 它只是将 XML 作为注解公开。具体的更改包括删除
-
@Type
-
@TypeDef
/@TypeDefs
-
@MapKeyType
-
@AnyMetaDef
/@AnyMetaDefs
-
@CollectionId#type
此外,@ParamDef#type
将在下一个测试版中被替换。
用户指南中对新的注解进行了很好的介绍。请特别查看《域模型》章节中的 基本类型 和 @Any映射 部分。
值得注意的是,可以使用这些新的注解作为元注解。请查看 @Any映射 部分中关于用 @AnyMetaDef
替代的示例。
时区支持
Hibernate的前几个版本在存储时区信息时使用了一个“规范化”方案;在写入数据库之前,基于时区的值会被规范化为UTC。虽然这是一种通常最佳的做法,但一些用户可能更喜欢使用其他策略,例如使用 WITH TIMEZONE
SQL数据类型的变体。为此,Hibernate添加了TimeZoneStorageType
枚举来指定如何处理时区细节。此策略可以通过使用hibernate.timezone.default_storage
设置在SessionFactory
级别指定,或通过使用@TimeZoneStorage
注解在属性级别指定。TimeZoneStorageType
定义了以下策略
- NORMALIZE
-
(默认)在写入前将Hibernate的传统行为规范化为UTC
- NATIVE
-
依赖底层数据库的
WITH TIMEZONE
支持。如果数据库没有本地支持WITH TIMEZONE
(如SQL规范所预期),则抛出异常。这一点很重要,因为它排除了定义了WITH TIMEZONE
但实际上不存储时区的数据库(例如PostgreSQL)。 - COLUMN
-
使用单独的列来存储时区。这会将值拆分为两个列,我们预计会有各种限制。注意,此策略尚未实现。
过程调用
通过Jakarta Persistence和Hibernate原生API实现了对过程调用的支持。
一个突出的问题,实际上是一个改进,与结果集映射有关。
待办事项
还有一些事情我们需要实现或修复。这不是一个全面的列表,但是我们已知不工作的事情的一个很好的开始。
-
自定义复合类型(见上文)
-
自定义集合类型(见上文)
-
缓存提供者 - 从5.x版本开始,Hibernate只支持通过JCache规范的可插拔缓存实现。`hibernate-jcache`模块使用Ehcache(作为JCache实现)进行测试。遗憾的是,Ehcache定义了一个依赖于Java EE的依赖项,这与Hibernate迁移到Jakarta EE相冲突。由于我们无法测试该模块,我们没有将其作为此测试版的一部分发布。我们将监视情况,并希望很快重新启用此模块。
-
统计信息 - 并非所有统计信息都已经被重新连接。
-
Gradle插件。Gradle的插件发布插件在尝试发布此测试版时给我们带来了问题。因此,为了发布Beta1,我们将暂时禁用发布此插件,直到这个问题得到解决。
我们知道这些不工作,因此不需要为这些创建Jira问题。